panic () stacktrace, işlev parametrelerini göstermiyor

Sep 07 2020

Aşağıdaki kodda:

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

Verileri saklamak ve işleve geçmek için 6 kelime kullanılıyor example.

  • sliceBaşlık için 3 kelime
  • strDize için 2 kelime
  • itamsayı için bir kelime

Beklenen yığın izleme:

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

Gerçek yığın izleme:

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

Neden oluşturulan yığın izleme panic()bu 6 kelimeyi göstermiyor?

Yanıtlar

5 Marc Sep 08 2020 at 06:11

Go gösteriliyor main.example(...)çünkü işlev derleyici tarafından satır içine alınmış ve artık bir işlev olarak mevcut değil, gömülü main()(yazdırma mantığının ayrıntıları traceback.go'da ).

Derleyici yönergesini kullanarak derleyiciye işlevi satır içi yapmamasını söyleyebilirsiniz :go:noinline

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

Satır içi devre dışı bırakıldığında, varsayılan geri izleme çıktısı main.exampleve parametrelerini gösterir :

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

Bunun makeyığın izlemede görünmediğini ve görünmediğini de unutmayın : daha önce paniculaşılmadan geri döndü .

Bir tavsiye : go:noinlineburada yığın izlemenin neden işlev bağımsız değişkenlerini içermediğini göstermek için kullanılır. Derleyicide hata ayıklamadıkça veya ona ihtiyaç duyan çalışma zamanı işlevleriyle uğraşmadıkça genellikle derleyici optimizasyon kararlarını zorlamamalıdır.