panic () stacktrace, işlev parametrelerini göstermiyor
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 kelimestrDize için 2 kelimeitamsayı 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
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.