パニック スタック トレースの「未知のフィールド」を理解する
パニック スタック トレースを解読しようとすると、見慣れない要素に遭遇することがあります。このようなインスタンスの 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 サイトの他の関連記事を参照してください。