GDBでは、どのようにして最上位の呼び出しスタックフレームに直接ジャンプできますか?


9

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

gdb>> up N

スタックの最上部(N番目のフレーム)に到達するには、Nがわからないという問題があります。コールスタック内のフレームの総数を見つけるコマンドはありますか?または、一番上のフレームにジャンプするための洗練された組み込みGDBコマンドはありますか?一番上のフレームがmain()関数であるべきだと思いました-その知識を利用して一番上のフレームに到達できますか?

回答:


9

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

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

1
スタックサイズが99999を超えると機能しません
Vivandiere

この答えは私にとってはうまくいきましたが、もっと大きな数を使う必要がありました。
tesch1

23

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

bt -20

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.