Heim > Artikel > Backend-Entwicklung > Was stellt das „Unbekannte Feld“ in einem Panic Stack Trace dar?
Bei der Analyse von Stack-Traces aus Panics kann es vorkommen, dass nach dem Funktionsnamen eine unbekannte Zahl auftritt. Wenn Sie beispielsweise den folgenden Code ausführen:
<code class="go">package main func F(a int) { panic(nil) } func main() { F(1) }</code>
erzeugt:
panic: nil goroutine 1 [running]: main.F(0x1, 0x10436000) /tmp/sandbox090887108/main.go:4 +0x20 main.main() /tmp/sandbox090887108/main.go:8 +0x20
Die zweite Zahl (0x10436000) mag rätselhaft erscheinen. Um es zu entschlüsseln, müssen wir uns mit der Natur der Stack-Trace-Daten befassen.
Die im Stack-Trace gedruckten Daten bestehen aus Funktionsargumenten. Diese Werte entsprechen jedoch nicht direkt den übergebenen Argumenten. Stattdessen stellen sie die im Speicher gespeicherten Rohdaten dar, insbesondere in zeigergroßen Werten.
In der Playground-Umgebung entsteht eine einzigartige Situation. Seine 64-Bit-Wortarchitektur verfügt über 32-Bit-Zeiger (GOARCH=amd64p32). Als Ergebnis geschieht jedes Mal, wenn ein Funktionsargument gedruckt wird, Folgendes:
Betrachten Sie die folgende Funktion Aufruf:
<code class="go">F(1)</code>
Der resultierende Stack-Trace zeigt:
main.F(0x97301, 0x10436000)
In diesem Fall belegt das uint8-Argument (1) nur die ersten 8 Bits des 64-Bit-Worts (0x97301 & 0x0f). Das zusätzliche 0x97300 und das gesamte 0x10436000 stellen den ungenutzten Teil des Wortes dar.
Für komplexere Funktionen, wie zum Beispiel:
<code class="go">func F(a, b, c uint32)</code>
aufgerufen mit:
<code class="go">F(1, 1, 1)</code>
Der Stack-Trace zeigt:
main.F(0x100000001, 0xc400000001)
weil die drei 32-Bit-Werte zwei Wörter belegen.
Rückgabewerte werden auch auf dem zugewiesen Stack, wie in der folgenden Funktion zu sehen:
<code class="go">func F(a int64) (int, int)</code>
Auf amd64 würden die Stack-Frame-Argumente wie folgt aussehen:
main.F(0xa, 0x1054d60, 0xc420078058)
mit einem Wort für die Eingabe und zwei für die Rückgabewerte . Beachten Sie, dass Rückgabewerte nicht initialisiert werden, sodass diese Informationen nur von begrenztem Nutzen sind.
Das obige ist der detaillierte Inhalt vonWas stellt das „Unbekannte Feld“ in einem Panic Stack Trace dar?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!