2016-11-29 6 views
0

main()がbar()を呼び出すfoo()を呼び出したとします。明らかに、foo()とbar()はユーザ/プログラマによって定義された関数です。また、これらの関数は呼び出し元の関数の途中で呼び出されるとします。gdbにユーザが作成した関数を誤って踏んだ後に正常に終了する

私がFoo()にいて、突然bar()に突然足を踏み入れると、bar()を残してGdbで呼び出しを行った後、Foo()

"finish"コマンドを使用しようとしましたが、foo()の関数呼び出しを終了してメインに戻ります。

また、プログラムカウンタがfoo()内の "call bar()"命令を指しているときにのみ "ni"コマンドを使用しましたが、ライブラリ関数ではないため動作しませんでした。ライブラリ関数をスキップするために "ni"が使われていると仮定します。

今のところ私が持っている唯一のアイデアは "コールバー()"の後の命令にブレークポイントを作成することですが、これを実行するより良い方法があるように感じます。ある?

ありがとうございます。

+1

'Finish'は私にとってうまく機能します。 GDBのマニュアルでさえ、「選択されたスタックフレームの関数が返ってくる直後まで実行を続ける」と言われています。 'Finish'コマンドについて –

+0

仕上げはうまくいくはずですが、最適化されたコードをデバッグしている場合やデバッグ情報がない場合は、問題が発生する可能性があります。 – dbrank0

答えて

2

私は「終了」コマンドを使用しようとしましたが、foo()の関数呼び出しを終了してメインに戻ることがわかりました。

finishを呼び出すときにfoo()のGDBフレーム(フレーム1)である場合、これは本当です。 bar()のフレーム(フレーム0)に切り替えて、finishを呼び出してみてください。この場合、gdbは1つのフレーム(フレーム0)しか終了しません。

関連する問題