ホームページ  >  記事  >  バックエンド開発  >  パニック スタック トレースの「不明なフィールド」は何を表しますか?

パニック スタック トレースの「不明なフィールド」は何を表しますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-05 00:08:02706ブラウズ

What does the

パニック スタック トレースの「不明なフィールド」について

パニックからのスタック トレースを分析しているときに、関数名の後に見慣れない数字が表示される場合があります。たとえば、次のコードを実行すると:

<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) があります。その結果、関数の引数が出力されるたびに、次のことが発生します:

  • ワード サイズがポインター サイズの 2 倍になり、偶数の値がフレーム引数に出力されます。 .
  • 64 ビット ワードの最初の 32 ビットのみが使用され、残りのビットは未使用のままになります。

引数データの例

次の関数を考えてみましょう。 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 サイトの他の関連記事を参照してください。

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