Heim  >  Artikel  >  Backend-Entwicklung  >  Was stellt das „Unbekannte Feld“ in einem Panic Stack Trace dar?

Was stellt das „Unbekannte Feld“ in einem Panic Stack Trace dar?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-05 00:08:02708Durchsuche

What does the

Verstehen von „Unbekanntes Feld“ im Panic-Stack-Trace

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.

Dekodierung der zusätzlichen Zahl

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:

  • Die Wortgröße ist doppelt so groß wie die Zeigergröße, was dazu führt, dass eine gerade Anzahl von Werten in den Rahmenargumenten gedruckt wird .
  • Nur ​​die ersten 32 Bits des 64-Bit-Worts werden verwendet, die restlichen Bits bleiben ungenutzt.

Beispiele für Argumentdaten

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 in Stack-Frames

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn