2017-09-12 14 views
3

私のプログラムでは、いつも起こらないセグメンテーション違反を見つけようとしています。私はセグメンテーションエラーが起こるまで、gdbのループで自分のプログラムを実行しようとしています。シグナルを受信して​​いるときにgdb whileループを停止する

私の問題は、gdbがsegフォルトを受け取った後にwhileループを継続し、gdbシェルで私にプロンプ​​トを表示しないということです。私は、GDBを実行したときに

私が使用します。

set $i=0 
while($i<100) 
    set $i = $i+1 
    r 
end 

誰もが知っている最初のセグメンテーションフォルトでgdbの停止を行い、100回を実行しないようにどのように?

ありがとうございます!

+0

関連:https://stackoverflow.com/questions/6545763/how-can-i-rerun-a-program-with-gdb-until-a-segmentation-fault-occurs –

+0

ページ設定をオフにする+終了時にブレークする私にとってはうまくいかなかったかもしれないし、多分私はそれを間違って使っている(私はGDBを初めて使っている)。 – Netap

+3

関連https://stackoverflow.com/q/37299926/72178 – ks1322

答えて

0

expectを使用してGDBの対話をスクリプトすることができます。

しかし、this answerの解決策が本当に必要です。あなたのプログラムではなくexit_exitを呼び出すことを出口で

ブレークは私が

それが可能だために動作しませんでしたので、あなたはそこにブレークポイントを設定する必要があるかもしれません。

exitまたは_exitを経由せずに直接システムコールを実行することもできます。 Linuxの

、あなたがこれをキャッチすることができます:

catch syscall exit 
catch syscall exit_group 

少なくとも1つから4つの変異体は、(単に手でプログラムを実行する)発射する必要があります。どのバリアントが実際に起動するかを知ったら、対応するブレークポイントにコマンドをアタッチし、上記のソリューションを使用します。

0

gdbドキュメントは膨大で、探しているものを見つけるのは難しいですが、それを実現するにはちょっとしたスクリプトを微調整するだけです。

終了時に、gdbは、終了コード値に$_exitcodeを設定します。

segvが発生した場合、値は変更されません。だから、私の考えは、それをいくつかのばかげた価値(私は244を選んだ)に設定して実行することでした。しかし、戻りコードが実行コマンドの後に、まだ244であれば、その後、

警告(多分それを行うための別の方法があります)ループを終了:先行ハック(それが動作します)

set $i=0 
while($i<100) 
    set $i = $i+1 
    set $_exitcode = 244 
    r 
    if $_exitcode==244 
    set $i = 200 
    end 
end 

私はそれをテストしました対話型プログラム。セグメンテーションフォルトをトリガするために通常の実行、およびyためnを入力し(まあ、それはないトリガーそれだろうが、それが起こるためには良いチャンスがあります)GDBセッション中

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    printf("want segfault?\n"); 
    char c = getchar(); 
    if (c=='y') 
    { 
    printf("%s", 'a'); // this is broken on purpose, to trigger segfault 
    } 
    return 0; 
} 

テスト:

(gdb) source gdbloop.txt 
[New Thread 6216.0x1d2c] 
want segfault? 
n 
[Inferior 1 (process 6216) exited normally] 
[New Thread 7008.0x1264] 
want segfault? 
n 
[Inferior 1 (process 7008) exited normally] 
[New Thread 8000.0x2754] 
want segfault? 
y 

Breakpoint 1, 0x76b2d193 in wtoi() from C:\windows\syswow64\msvcrt.dll 
(gdb) 

だから、segfaultが起動されたときにプロンプ​​トが出ます。

関連する問題