2017-12-05 11 views
18

パニックからスタックトレースをデバッグする方法を習得しようとすると、混乱していました。パニックスタックトレースで不明なフィールド

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 

が、私は二番目の数字は何を意味するのか解読することはできません((main.Fで0x10436000を0x1の、0x10436000)) 。 2番目のint引数がある場合、または最初の引数として渡された場合は何も表示されません(2番目の再生リンクに表示されます)。

一つの引数:https://play.golang.org/p/3iV48xlNFR

二引数:https://play.golang.org/p/4jA7ueI86K

+0

数字「0x10436000」は他のスタックトレースにも表示されているようです。私はその意義が何であるか分かりません。 https://github.com/golang/go/issues/20763 –

+0

これは本当に面白いです。私は別の出力 'main.F(0x1)'を得る(https://gist.github.com/hectorcorrea/5fd563f1dabb88bd0f351c0fc2bae5eeを参照)。私はMac上で1.7.1を使用していることに注意してください。 –

+0

OSXでGo 1.9を使って@HectorCorreaと同じことができます。 Goのバージョンと環境は何ですか? – Kaedys

答えて

14

スタックトレースに印刷されたデータは、引数であるが、値が渡された引数に直接対応していない、それが印刷された生データですポインタサイズの値で指定します(通常これはネイティブワードサイズと同じです)。プレイグラウンドは、32ビットポインタ(GOARCH=amd64p32)を持つ64ビットワードアーキテクチャであるという点で、わずかにユニークです。

traceback.goでは、ポインタサイズに基づいて引数をステップ実行することによって値が出力されることがわかります。

だから、
for i := uintptr(0); i < frame.arglen/sys.PtrSize; i++ { 

ワードサイズは遊び場でのポインタサイズの倍の大きさであるので、あなたは常にフレームの引数に印刷された値の偶数を持っています。

データが提示される方法の別の例は、関数の引数に小さいタイプを使用して、遊び場に見ることができる:64ビットワードのhttps://play.golang.org/p/vHZDEHQZLh

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

// F(1) 
// main.F(0x97301, 0x10436000) 

だけ最初の8ビットがある、使用されている0x97301 & 0x0f 、または単に1です。第1の値からの余分な数字は0x97300であり、0x10436000の全体は、関数によって使用されていない最初の64ビットワードの残りの部分にすぎません。

さらに多くの引数を使用すると、amd64システムで同じ動作が確認できます。例えば、この署名。

func F(a, b, c uint32) 

F(1, 1, 1)経由で呼び出されたとき、それは次のようにスタックトレースを出力します:3つの32ビット値を注意することは2つのワード

値の最終セットを取るため

main.F(0x100000001, 0xc400000001) 

は戻り値であり、スタックにも割り当てられます。次の関数のシグネチャ:aのための1つの単語、および(int, int)戻り値のための2つ以上で

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

:AMD64上

func F(a int64) (int, int) 

は、のようなスタックフレームの引数を示します。しかし、戻り値は初期化されていないので、なぜこれらの値が存在するのかを理解する以外には、私がここで得たことはあまりありません。

+0

Typo:32ビットポインタを使用した64ビットワードアーキテクチャ? –

+0

@ poncho-staccato:ありがとう、固定 – JimB

+2

きれいに書かれています! – icza

関連する問題