panic () stacktrace zeigt keine Funktionsparameter an
Im folgenden Code:
package main
func main() {
example(make([]string, 2, 4), "hello", 10)
}
func example(slice []string, str string, i int) {
panic("Want stack trace")
}
6 Wörter werden verwendet, um Daten zu speichern und an die Funktion zu übergeben example.
- 3 Wörter für den
sliceHeader - 2 Wörter für
strZeichenfolge - ein Wort für
iGanzzahl
Erwartete Stapelverfolgung:
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
Tatsächliche Stapelverfolgung:
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
Warum zeigt der aus generierte Stacktrace panic()diese 6 Wörter nicht an?
Antworten
Go wird angezeigt , main.example(...)weil die Funktion vom Compiler eingebunden ist und nicht mehr als Funktion existiert, sondern eingebettet wurde main()(Details zur Drucklogik finden Sie in traceback.go ).
Mit der Compiler-Direktive können Sie den Compiler anweisen, die Funktion nicht zu integrieren :go:noinline
//go:noinline
func example(slice []string, str string, i int) {
panic("Want stack trace")
}
Bei deaktiviertem Inlining werden die Standard-Traceback-Ausgabe main.exampleund ihre Parameter angezeigt :
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
Beachten Sie, dass makedies nicht in der Stapelverfolgung angezeigt wird und auch nicht angezeigt werden kann: Es wurde zurückgegeben, bevor panices jemals erreicht wurde.
Ein Tipp : go:noinlineHier wird gezeigt, warum der Stack-Trace keine Funktionsargumente enthält. Im Allgemeinen sollten Entscheidungen zur Compileroptimierung nicht erzwungen werden, es sei denn, Sie debuggen den Compiler oder befassen sich mit Laufzeitfunktionen, die ihn benötigen.