Das „unbekannte Feld“ in Panic Stack Traces verstehen
Bei der Suche nach der Entschlüsselung von Panic Stack Traces kann es zu unbekannten Elementen kommen. Eine solche Instanz tritt innerhalb des zweiten Arguments von Funktionsaufrufen in einem Panic-Stack-Trace auf.
Betrachten wir den folgenden Code, um dies zu veranschaulichen:
<code class="go">package main func F(a int) { panic(nil) } func main() { F(1) }</code>
Bei der Ausführung gibt dieser Code Folgendes aus:
panic: nil goroutine 1 [running]: main.F(0x1, 0x10436000) /tmp/sandbox090887108/main.go:4 +0x20 main.main() /tmp/sandbox090887108/main.go:8 +0x20
Das zweite Argument (0x10436000) in main.F(0x1, 0x10436000) muss geklärt werden.
Dekodierung des unbekannten Feldes
Das Die im Stack-Trace angezeigten Werte sind die Argumente der Funktion, sie entsprechen jedoch nicht direkt den übergebenen Werten. Stattdessen stellen sie die Rohdaten dar, die in zeigergroßen Werten gespeichert sind.
Im gegebenen Fall läuft der Spielplatz auf einer 64-Bit-Architektur mit 32-Bit-Zeigern (GOARCH=amd64p32). In einem solchen Setup wird jeder Wert in einem 64-Bit-Wort gespeichert, während Zeiger 32-Bit-Worte sind.
Die Funktion F(a int) akzeptiert ein einzelnes Argument vom Typ int. Das Stack-Trace-Argument wird in einem 64-Bit-Wort gespeichert. Da die Zeigergröße 32 Bit beträgt, enthalten die ersten 32 Bits den Zeiger auf das Argument (0x1) und die restlichen 32 Bits (0x10436000) werden nicht verwendet.
Weitere Beispiele
Um dieses Konzept weiter zu veranschaulichen, betrachten wir ein weiteres Beispiel:
<code class="go">func F(a uint8) { panic(nil) } func main() { F(1) }</code>
Dieser Code gibt Folgendes aus:
panic: nil goroutine 1 [running]: main.F(0x97301, 0x10436000)
Hier ist das Argument a vom Typ uint8, der 8 belegt Bits. Die ersten 8 Bits des 64-Bit-Worts enthalten den Wert a (1), während die restlichen 56 Bits (0x97300 und 0x10436000) ungenutzt sind.
Rückgabewerte
Stack-Frames zeigen neben Argumenten auch Rückgabewerte an, die auf dem Stack allokiert werden. Beispielsweise würde die Funktionssignatur:
<code class="go">func F(a int64) (int, int)</code>
auf AMD64-Systemen die Stack-Frame-Argumente wie folgt anzeigen:
main.F(0xa, 0x1054d60, 0xc420078058)
Der erste Wert stellt das Argument dar, während die beiden nachfolgenden Werte darstellen die Rückgabewerte (int und int). Da Rückgabewerte jedoch nicht initialisiert sind, liefern sie nicht viele nützliche Informationen.
Das obige ist der detaillierte Inhalt vonWas ist das „Unbekannte Feld' in Go Panic Stack Traces?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!