2010-12-01 26 views
80

Linuxでgdbで動作するようにプログラムでCまたはC++コードでブレークポイントを設定するにはどうすればよいですか?Linux上のgdbのCまたはC++コードでブレークポイントをプログラムで設定する

すなわち:

int main(int argc, char** argv) 
{ 
    /* set breakpoint here! */ 
    int a = 3; 
    a++; /* In gdb> print a; expect result to be 3 */ 
    return 0; 
} 
+7

を呼び出すことができますが、移植性を心配している場合、あなたはまた、おそらく心配しています正しさ - したがって、 'main main'ではなく' int main'です。 –

+0

@Stuart - 修正されました。しばらく前にそれをしていたはずです。 –

+3

@ J.Polfer: 'return 0'は必要ありませんが、ちょうどノイズです! –

答えて

77

一つの方法は、割り込み信号ですMSDN states Windowsは本当に、SIGINTをサポートしていない移植性が懸念される場合にはそう、 SIGABRTを使用する方がよいでしょう。私は仕事のプロジェクトで

+0

これは移植性が高いですよね? –

+0

はい、これはオペレーティングシステム/コンパイラ/デバッガで動作するはずです。 –

+1

私は他のデバッガーについては知らないが、gdbは[信号処理](http://www.delorie.com/gnu/docs/gdb/gdb_39.html)についてかなり柔軟である。 – Cascabel

18

hereを見ることによって、私は、次の方法を見つけた:

void main(int argc, char** argv) 
{ 
    asm("int $3"); 
    int a = 3; 
    a++; // In gdb> print a; expect result to be 3 
} 

これは私にはハックのタッチです。そして、私はこれがx86アーキテクチャでのみ動作すると思います。 Cでは

#include <csignal> 

// Generate an interrupt 
std::raise(SIGINT); 

#include <signal.h> 
raise(SIGINT); 

UPDATE

+3

そして、AT&Tアセンブリ構文をサポートするコンパイラでのみ。特に、Microsoftのコンパイラ( 'cl.exe')はこの構文をサポートしていませんが、別の構文を使用しています。 –

+0

質問はLinuxに関するものだったので、gccの構文はx86で動作すると推測できます。 –

+0

BTW - 私はx86マシンで上記を試しましたが、うまくいきました。より良い方法があれば私は興味がありました。そこにあるように見える。 –

25

、我々はこれを行う:。

raise(SIGABRT); /* To continue from here in GDB: "signal 0". */ 

(私たちのケースでは、これが可能ならばクラッシュレポートを生成し、デバッガの外に起こった場合は、ハードクラッシュしたかったことはそれは我々が使用理由の一つです。。SIGABRT Windows版、Mac間で高い移植これを行うと、Linuxはいくつかの試みを取った私たちは親切に、ここでコメントし、数#ifdefs、になってしまった:。http://hg.mozilla.org/mozilla-central/file/98fa9c0cff7a/js/src/jsutil.cpp#l66

+2

通常のウィンドウは他のものと同じようには見えません:) – mathk

+0

「信号0」を発行してプログラムを一時停止状態で継続することは可能ですか?この時点から 'n'または 's'を使用することができればいいと思いますが、 'c'は発行されません。 –

+1

@JasonDoucetteもしあなたが本当にプログラムを一時停止させたいのであれば、あなたのプログラムに 'breakpoint()'関数を追加することができます(空でもよいし、単にprint文を含む)/.gdbinit'。 –

9

__asm__("int $3");動作するはずです:

int main(int argc, char** argv) 
{ 
    /* set breakpoint here! */ 
    int a = 3; 
    __asm__("int $3"); 
    a++; /* In gdb> print a; expect result to be 3 */ 
    return 0; 
} 
OS X上で
+0

素晴らしい、ありがとう! – leishman

+1

私はこれを '#define 'するのが好きなので、構文を覚えておく必要はありません。 debiuggerを停止すると、すべての変数とスタックを調べてみましょう。なぜなら、ときどき 'assert()'の代わりに私のコード全体に振りかけるのです。そして、もちろん、アサートのように、私は生産コードのためにそれを削除する必要はありません – Mawg

1

あなただけ(nitpickて申し訳ありません)サイドノート非常std::abort()(これは、Linux上で同じであるかもしれない)

+0

どのライブラリですか? – Alex

関連する問題