パニックからのスタック トレースを分析しているときに、関数名の後に見慣れない数字が表示される場合があります。たとえば、次のコードを実行すると:
<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
2 番目の数値 (0x10436000) は謎に見えるかもしれません。これをデコードするには、スタック トレース データの性質を詳しく調べる必要があります。
スタック トレースに出力されるデータは、関数の引数で構成されます。ただし、これらの値は、渡される引数に直接対応するものではありません。代わりに、メモリに格納されている生のデータ、特にポインター サイズの値を表します。
Playground 環境では、独特の状況が発生します。 64 ビット ワード アーキテクチャには 32 ビット ポインター (GOARCH=amd64p32) があります。その結果、関数の引数が出力されるたびに、次のことが発生します:
次の関数を考えてみましょう。 call:
<code class="go">F(1)</code>
結果のスタック トレースは次のようになります:
main.F(0x97301, 0x10436000)
この場合、uint8 引数 (1) は 64 ビット ワード (0x97301) の最初の 8 ビットのみを占めます。 &0x0f)。追加の 0x97300 と 0x10436000 全体は、単語の未使用部分を表します。
次のようなより複雑な関数の場合:
<code class="go">func F(a, b, c uint32)</code>
で呼び出されます:
<code class="go">F(1, 1, 1)</code>
スタック トレースには次のことが表示されます:
main.F(0x100000001, 0xc400000001)
3 つの 32 ビット値が 2 ワードを占有するためです。
戻り値はスタック フレームにも割り当てられます。次の関数に見られるようにスタック:
<code class="go">func F(a int64) (int, int)</code>
amd64 では、スタック フレーム引数は次のように表示されます:
main.F(0xa, 0x1054d60, 0xc420078058)
。入力に 1 ワード、戻り値に 2 ワードを持ちます。 。戻り値は初期化されないため、この情報の用途は限定的であることに注意してください。
以上がパニック スタック トレースの「不明なフィールド」は何を表しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。