ホームページ >バックエンド開発 >Golang >Go Panic スタック トレースの「不明なフィールド」とは何ですか?

Go Panic スタック トレースの「不明なフィールド」とは何ですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-04 21:07:01216ブラウズ

What is the

パニック スタック トレースの「未知のフィールド」を理解する

パニック スタック トレースを解読しようとすると、見慣れない要素に遭遇することがあります。このようなインスタンスの 1 つは、パニック スタック トレースの関数呼び出しの 2 番目の引数内で発生します。

これを説明するために次のコードを考えてみましょう:

<code class="go">package main

func F(a int) {
    panic(nil)
}

func main() {
    F(1)
}</code>

このコードを実行すると、次の出力が出力されます。

panic: nil

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

main.F(0x1, 0x10436000) の 2 番目の引数 (0x10436000) は、明確にする必要があるものです。

未知のフィールドのデコード

スタック トレースに表示される値は関数の引数ですが、渡された値に直接対応するわけではありません。代わりに、これらはポインター サイズの値で格納された生データを表します。

指定されたケースでは、プレイグラウンドは 32 ビット ポインターを備えた 64 ビット アーキテクチャで実行されます (GOARCH=amd64p32)。このような設定では、各値は 64 ビット ワードに格納されますが、ポインターは 32 ビットです。

関数 F(a int) は、int 型の引数を 1 つ受け取ります。スタック トレース引数は 64 ビット ワードで格納されます。ポインタ サイズは 32 ビットであるため、最初の 32 ビットには引数 (0x1) へのポインタが含まれ、残りの 32 ビット (0x10436000) は未使用です。

その他の例

この概念をさらに詳しく説明するために、別の例を考えてみましょう:

<code class="go">func F(a uint8) {
    panic(nil)
}

func main() {
    F(1)
}</code>

このコードの出力:

panic: nil

goroutine 1 [running]:
main.F(0x97301, 0x10436000)

ここで、引数 a は uint8 型で、8 を占有します。ビット。 64 ビット ワードの最初の 8 ビットには a (1) の値が含まれますが、残りの 56 ビット (0x97300 および 0x10436000) は使用されません。

戻り値

スタック フレームには、引数に加えて、スタックに割り当てられた戻り値も表示されます。たとえば、amd64 システムの関数シグネチャ:

<code class="go">func F(a int64) (int, int)</code>

は、スタック フレーム引数を次のように表示します。

main.F(0xa, 0x1054d60, 0xc420078058)

最初の値は引数を表し、後続の 2 つの値は次のように表します。戻り値 (int と int)。ただし、戻り値は初期化されていないため、あまり有用な情報は得られません。

以上がGo Panic スタック トレースの「不明なフィールド」とは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。