17

GDBで実行可能ファイルを繰り返し実行し、できればエラーで停止する方法を見つけようとしています。

マニュアルでこれを行う方法を見つけることができませんでした!

ありがとう

4

5 に答える 5

17

私は(Bashで)試しました:

while true ; do gdb -ex run a.out -ex quit ; done ;

残念ながら、これをやめるのはかなり難しいことがわかりましたが、実行は自動化され、プログラムがクラッシュすると(SIGABRTを引き起こす古いプログラムでテストしました)、gdbは「プログラムは実行中です。とにかく終了しますか?(yまたはn)」なので、nを押すだけです。

于 2012-05-04T09:24:24.167 に答える
7

私はこれと同じ問題に遭遇し、BoBTFishが提案した無限ループを停止するためのかなり良い方法だと思うものを思いつきました。

ループする代わりにwhile true、ダミーファイルの存在を使用してループを制御できます。例:

touch loopfile; while [ -f loopfile ] ; do gdb -ex run a.out -ex quit ; done ;

無限のデバッグセッションを停止する場合は、同じディレクトリで新しいターミナルを開くか、でrm loopfile中断しcontrol-cてから削除することで同じターミナルを終了できloopfileますgdb

^CQuit
A debugging session is active.

    Inferior 1 [process 11136] will be killed.

Quit anyway? (y or n) n
Not confirmed.
(gdb) shell rm loopfile 
(gdb) quit
A debugging session is active.

    Inferior 1 [process 11136] will be killed.

Quit anyway? (y or n) y

うまくいけば、これは将来誰かに役立つでしょう、それは断続的な問題をデバッグするための良い(ハックの場合)方法のようです。

于 2012-08-08T05:18:27.593 に答える
3

ループ+LDパス+コマンドライン引数の例

for i in {0..99}; do LD_LIBRARY_PATH=/some/path/to/libs gdb -ex 'set args arg1 arg2 arg3' -ex run ./execName -ex quit ; done
于 2014-05-09T13:36:33.253 に答える
2

シェルスクリプトを使用して繰り返し実行gdbし、--batch -x <cmdfile>オプションを使用して、プログラムを実行するためgdbの単語を含むコマンドファイルを指定しますrun。だからこのようなもの:

$ echo run > cmdfile ; while gdb --batch -x cmdfile myprogram ; do : ; done
于 2012-05-04T09:23:05.173 に答える
1

簡単な方法の1つは、コードの最後に1つのブレークポイントを配置し、プログラムを再度実行するようにブレークポイントコマンドを構成することです。たとえば、プログラムが常に最後のメインラインを通過する場合(突然の終了がないと仮定)、次のことができます。

(gdb) b <last line of main here>
(gdb) commands
> run [command line args]
> end

CTRL-Cだけで実行を停止できます。もちろん、GDBは、セグメンテーション違反または別のブレークポイントを検出すると実行を停止し、エラーをキャッチできるようにします。

ほとんどの複雑なケースでは、想像力を使ってブレークポイントに適した場所を見つけることができます。たとえば、exit()関数でbpを設定できます。

于 2021-03-11T21:35:25.730 に答える