如何以编程方式在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;
}
答案 0 :(得分:88)
一种方法是发出中断信号:
#include <csignal>
// Generate an interrupt
std::raise(SIGINT);
在C:
#include <signal.h>
raise(SIGINT);
更新:MSDN states Windows并不真正支持SIGINT
,因此如果担心可移植性,最好使用SIGABRT
。
答案 1 :(得分: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 :(得分:19)
通过查看here,我发现了以下方式:
void main(int argc, char** argv)
{
asm("int $3");
int a = 3;
a++; // In gdb> print a; expect result to be 3
}
这对我来说似乎是一种触动。我认为这只适用于x86架构。
答案 3 :(得分:10)
__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;
}
答案 4 :(得分:4)
令人失望的是看到如此多的答案没有使用专用信号作为软件断点SIGTRAP
:
#include <signal.h>
raise(SIGTRAP); // At the location of the BP.
答案 5 :(得分:1)
在OS X上,您只需调用std::abort()
(在Linux上可能相同)