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;
}
1つの方法は、割り込みを通知することです。
#include <csignal>
// Generate an interrupt
std::raise(SIGINT);
Cで:
#include <signal.h>
raise(SIGINT);
[〜#〜] update [〜#〜]: MSDN状態 WindowsはSIGINT
。したがって、移植性が懸念される場合は、おそらくSIGABRT
を使用することをお勧めします。
私が取り組んでいるプロジェクトでは、次のことを行います。
raise(SIGABRT); /* To continue from here in GDB: "signal 0". */
(この場合、デバッガの外部でこれが発生した場合、ハードクラッシュし、可能であればクラッシュレポートを生成したかったのです。それがSIGABRTを使用した理由の1つです。 #ifdefs、役立つコメントがあります: http://hg.mozilla.org/mozilla-central/file/98fa9c0cff7a/js/src/jsutil.cpp#l66 。)
here を見ると、次の方法が見つかりました。
void main(int argc, char** argv)
{
asm("int $3");
int a = 3;
a++; // In gdb> print a; expect result to be 3
}
これは私にとってはちょっとハックのようです。そして、これはx86アーキテクチャでのみ機能すると思います。
__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では、std::abort()
を呼び出すことができます(Linuxでも同じかもしれません)