panic () stacktrace zeigt keine Funktionsparameter an

Sep 07 2020

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

5 Marc Sep 08 2020 at 06:11

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.