Was ist das „Unbekannte Feld' in Go Panic Stack Traces?

Mary-Kate Olsen
Freigeben: 2024-11-04 21:07:01
Original
199 Leute haben es durchsucht

What is the

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

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

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

Dieser Code gibt Folgendes aus:

panic: nil

goroutine 1 [running]:
main.F(0x97301, 0x10436000)
Nach dem Login kopieren

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

auf AMD64-Systemen die Stack-Frame-Argumente wie folgt anzeigen:

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

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!

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