GDBで実行可能ファイルを繰り返し実行し、できればエラーで停止する方法を見つけようとしています。
マニュアルでこれを行う方法を見つけることができませんでした!
ありがとう
私は(Bashで)試しました:
while true ; do gdb -ex run a.out -ex quit ; done ;
残念ながら、これをやめるのはかなり難しいことがわかりましたが、実行は自動化され、プログラムがクラッシュすると(SIGABRTを引き起こす古いプログラムでテストしました)、gdbは「プログラムは実行中です。とにかく終了しますか?(yまたはn)」なので、nを押すだけです。
私はこれと同じ問題に遭遇し、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
うまくいけば、これは将来誰かに役立つでしょう、それは断続的な問題をデバッグするための良い(ハックの場合)方法のようです。
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
シェルスクリプトを使用して繰り返し実行gdb
し、--batch -x <cmdfile>
オプションを使用して、プログラムを実行するためgdb
の単語を含むコマンドファイルを指定しますrun
。だからこのようなもの:
$ echo run > cmdfile ; while gdb --batch -x cmdfile myprogram ; do : ; done
簡単な方法の1つは、コードの最後に1つのブレークポイントを配置し、プログラムを再度実行するようにブレークポイントコマンドを構成することです。たとえば、プログラムが常に最後のメインラインを通過する場合(突然の終了がないと仮定)、次のことができます。
(gdb) b <last line of main here>
(gdb) commands
> run [command line args]
> end
CTRL-Cだけで実行を停止できます。もちろん、GDBは、セグメンテーション違反または別のブレークポイントを検出すると実行を停止し、エラーをキャッチできるようにします。
ほとんどの複雑なケースでは、想像力を使ってブレークポイントに適した場所を見つけることができます。たとえば、exit()関数でbpを設定できます。