panic () stacktrace에 함수 매개 변수가 표시되지 않음

Sep 07 2020

아래 코드에서 :

package main
    
func main() {
    example(make([]string, 2, 4), "hello", 10)
}
    
func example(slice []string, str string, i int) {
    panic("Want stack trace")
}

데이터를 저장하고 기능에 전달하는 데 6 개의 단어가 사용됩니다 example.

  • slice헤더 3 단어
  • str문자열 2 단어
  • i정수에 대한 한 단어

예상 스택 추적 :

goroutine 1 [running]:
main.example(0xc000042748, 0x2, 0x4, 0x106abae, 0x5, 0xa)
    stack_trace/example1/example1.go:13 +0x39
main.main()
    stack_trace/example1/example1.go:8 +0x72
    
// Declaration
main.example(slice []string, str string, i int)
    
// Call
make([]string, 2, 4), "hello", 10
    
// Values (0xc000042748, 0x2, 0x4, 0x106abae, 0x5, 0xa)
Slice Value:   0xc000042748, 0x2, 0x4
String Value:  0x106abae, 0x5
Integer Value: 0xa

실제 스택 추적 :

panic: Want stack trace
    
goroutine 1 [running]:
main.example(...)
        /home/../Main.go:8
main.main()
        /home/../Main.go:4 +0x39
exit status 2

$ go version
go version go1.14.3 linux/amd64

에서 생성 된 스택 트레이스가 panic()6 개 단어를 표시 하지 않는 이유는 무엇 입니까?

답변

5 Marc Sep 08 2020 at 06:11

이동이 표시되어 main.example(...)때문에 함수는 컴파일러에 의해 인라인 더 이상,이에 포함되어있어 함수로 존재하지 않는 main()(인쇄 논리의 세부 사항은에 traceback.go ).

당신은 컴파일러를 말할 수있는 함수를 인라인하지 사용하여 go:noinline 컴파일러 지시문을 :

//go:noinline
func example(slice []string, str string, i int) {
  panic("Want stack trace")
}

인라인을 비활성화하면 기본 트레이스 백 출력에 다음 main.example과 같은 매개 변수가 표시됩니다.

panic: Want stack trace

goroutine 1 [running]:
main.example(0xc000046738, 0x2, 0x4, 0x473f27, 0x5, 0xa)
    /home/me/stuff/src/github.com/me/testing/panic/main.go:9 +0x39
main.main()
    /home/me/stuff/src/github.com/me/testing/panic/main.go:4 +0x72

make를 스택 추적에 표시도 할 수 없습니다 : 그것은 전에 돌아왔다는 panic지금까지 도달한다.

조언 : go:noinline스택 추적에 함수 인수가 포함되지 않은 이유를 보여주기 위해 여기서 사용됩니다. 일반적으로 컴파일러를 디버깅하거나 필요한 런타임 함수를 처리하지 않는 한 컴파일러 최적화 결정을 강요해서는 안됩니다.