在Linux上以编程方式在C或C ++代码中为gdb设置断点

我怎样才能在C或C ++代码中设置一个断点,这对Linux上的gdb有效?

即:

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

一种方法是发信号中断:

 #include <csignal> // Generate an interrupt std::raise(SIGINT); 

在C:

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

更新 : MSDN指出 Windows并不真的支持SIGINT ,所以如果可移植性是一个问题,那么最好使用SIGABRT

在我工作的一个项目中,我们这样做:

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

(在我们的例子中,如果发生在debugging器外部,我们想要崩溃,如果可能的话,会生成一个崩溃报告,这是我们使用SIGABRT的一个原因,在Windows,Mac和Linux上这样做是可移植的, #ifdefs,在这里有用的评论: http : //hg.mozilla.org/mozilla-central/file/98fa9c0cff7a/js/src/jsutil.cpp#l66 。)

通过看这里 ,我find了以下的方法:

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

这对我来说似乎有些</s> </s>。 我认为这只适用于x86架构。

__asm__("int $3"); 应该pipe用:

 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上它可能是一样的)