Go에서 고루틴 스택 추적 덤프

Jay Singh 2022년8월23일
Go에서 고루틴 스택 추적 덤프

이상한 상황을 처리하는 관용적 접근 방식은 Go 프로그램에서 오류를 사용하는 것입니다. 오류는 소프트웨어에서 발생하는 대부분의 비정상적인 경우를 유발합니다.

그러나 드문 경우지만 소프트웨어는 비정상적인 상태로 인해 계속 실행할 수 없습니다. 이 상황에서 panic은 프로그램을 일찍 종료할 수 있습니다.

함수에 panic이 발생하면 함수 실행이 중지되고 지연된 함수가 실행되며 제어는 함수 호출자에게 돌아갑니다.

이 절차는 현재 고루틴의 모든 기능이 반환될 때까지 계속됩니다. 이때 프로그램은 종료되기 전에 panic 메시지를 출력한 다음 스택 추적을 출력합니다.

예제 프로그램을 구성할 때 이것은 더 명확해질 것입니다.

panic을 사용하여 Go에서 고루틴 스택 추적 덤프

이 간단한 스크립트는 사람의 전체 이름을 인쇄합니다. fullName 함수는 사람의 전체 이름을 반환합니다.

이 메소드는 firstNamelastName 포인터에서 nil 값을 확인합니다. nil인 경우 함수는 메시지와 함께 panic 신호를 보냅니다.

프로그램이 완료되면 이 메시지를 인쇄합니다.

package main

import (
    "fmt"
)

func fullName(firstName *string, lastName *string) {
    if firstName == nil {
        panic("runtime error: first name cannot be nil")
    }
    if lastName == nil {
        panic("runtime error: last name cannot be nil")
    }
    fmt.Printf("%s %s\n", *firstName, *lastName)
    fmt.Println("returned normally from fullName")
}

func main() {
    firstName := "Jay"
    fullName(&firstName, nil)
    fmt.Println("returned normally from main")
}

출력:

panic: runtime error: last name cannot be nil

goroutine 1 [running]:
main.fullName(0x405058?, 0xc000070f70?)
    /tmp/sandbox885911142/prog.go:12 +0x114
main.main()
    /tmp/sandbox885911142/prog.go:20 +0x35

이제 아래 예제는 내장 len에서 제공하는 길이를 사용하여 슬라이스의 최종 요소에 액세스하려고 시도하는 일반적인 실수를 범합니다.

이것이 panic을 유발할 수 있는 이유를 보여주기 위해 다음 코드를 실행하십시오.

package main

import (
    "fmt"
)
func main() {
    names := []string{
        "Iron Man",
        "Thor",
    }
    fmt.Println("My favorite superhero is:", names[len(names)])
}

출력:

panic: runtime error: index out of range [2] with length 2

goroutine 1 [running]:
main.main()
    /tmp/sandbox2746930010/prog.go:12 +0x1b