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

Patricia Arquette
Freigeben: 2024-11-05 00:08:02
Original
706 Leute haben es durchsucht

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>
Nach dem Login kopieren

erzeugt:

panic: nil

goroutine 1 [running]:
main.F(0x1, 0x10436000)
    /tmp/sandbox090887108/main.go:4 +0x20
main.main()
    /tmp/sandbox090887108/main.go:8 +0x20
Nach dem Login kopieren

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>
Nach dem Login kopieren

Der resultierende Stack-Trace zeigt:

main.F(0x97301, 0x10436000)
Nach dem Login kopieren

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>
Nach dem Login kopieren

aufgerufen mit:

<code class="go">F(1, 1, 1)</code>
Nach dem Login kopieren

Der Stack-Trace zeigt:

main.F(0x100000001, 0xc400000001)
Nach dem Login kopieren

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>
Nach dem Login kopieren

Auf amd64 würden die Stack-Frame-Argumente wie folgt aussehen:

main.F(0xa, 0x1054d60, 0xc420078058)
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!