it-swarm-ja.com

GDBで、最上位のコールスタックフレームに直接ジャンプするにはどうすればよいですか?

私は、無限の再帰的な混乱の奥深くに降りた後、障害をセグメント化するCプログラムを持っています。コールスタックフレームは次のようになっているため、GDBでプロセスをバックトレースしても意味がありません。 少なくとも 1000フレームの深さで、繰り返される関数呼び出しは、一連の4つの一般的な再帰関数呼び出しです(したがって、ブレークポイントは役に立たないように見えます)。バックトレースを繰り返し呼び出すと、4つの関数名が何度も何度も読み取られます。 'up''up''up' ...を実行すると、私はより高くなるので、このパターンが最初に発生し始めた場所を確認できましたが、最上位の呼び出しから開始する方が効率的であるように思われました。フレームをスタックし、代わりにステップダウンします。私の勘は、無限再帰がプロセスの早い段階で始まるということです。コールスタックに合計Nフレームが含まれている場合、私は

gdb>> up N

スタックの一番上(N番目のフレーム)に到達しますが、問題はNがわからないことです。呼び出しスタック内のフレームの総数を見つけるためのコマンドはありますか?または、一番上のフレームにジャンプするための洗練された組み込みのGDBコマンドはありますか?一番上のフレームは メイン() 機能-その知識を活用して最上位のフレームに到達できますか?

9
dandrews

私のテストでは、非常に大きな数で「up」を使用すると、一番上のフレームが表示されました。

(gdb) up 99999
#58 0x0000000000442fb4 in main ()
9
user89061

一番上のフレームから開始するには、負の数で「bt」を指定できます。

bt -20

次に、「frame」(または「f」)を使用して、目的のフレームに直接移動できます。

23
BlakBat

fr 0は最上位のスタックフレームに移動します。 frはフレームを表します。

1
The Vivandiere