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

时间:2010-12-01 16:17:35

标签: c++ c linux 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;
}

6 个答案:

答案 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上可能相同)