Go でパニック エラーをデバッグするときに、謎の「パニック スタック トレースの不明なフィールド」に遭遇することは珍しいことではありません。この謎を解明するために、スタック トレースの複雑さを詳しく調べてみましょう。
提供されたコード スニペット:
package main func F(a int) { panic(nil) } func main() { F(1) }
プログラムを実行すると、パニック スタック トレースが明らかになります:
panic: nil goroutine 1 [running]: main.F(0x1, 0x10436000) /tmp/sandbox090887108/main.go:4 +0x20 main.main() /tmp/sandbox090887108/main.go:8 +0x20
F(0x1) と並んで言及されている不可解な値 0x10436000 の意味は何ですか?
値 0x10436000 は関数の 2 番目の引数ではありません。代わりに、最初の引数として渡される生データ値を表し、ポインター サイズの値として表されます。これは、64 ビットのワード サイズと 32 ビットのポインター (GOARCH=amd64p32) を特徴とするプレイグラウンド アーキテクチャの結果です。
traceback.go ファイルでは、値は、ポインター サイズに基づいて引数に反復的にアクセスすることによって出力されます。
for i := uintptr(0); i < frame.arglen/sys.PtrSize; i++ {
これは、ワード サイズがプレイグラウンド内のポインター サイズの 2 倍であるため、値のペアが各フレームの引数に出力されることを意味します。
さらに説明するには:
func F(a uint8) { panic(nil) }
F(1) の結果の呼び出しin:
main.F(0x97301, 0x10436000)
64 ビット ワードの最初の 8 ビット (この場合は 1) のみが使用され、残りは未使用です。
main.F(0x100000001, 0xc400000001)
3 つの引数は 2 ワードを占有し、余分な未使用の値が出力されます。
func F(a int64) (int, int)
amd64 では、スタック フレーム引数は次のように表示されます。
main.F(0xa, 0x1054d60, 0xc420078058)
最初の単語は for引数、他の 2 つは初期化されていない戻り値用です。
以上がGo パニック スタック トレースの「不明なフィールド」の意味は何ですか?また、トレースバックの引数をデコードするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。