在C或C+中设置断点+;在Linux上以编程方式为gdb编写代码 > >如何在C或C++代码中设置断点,这将对Linux上的GDB工作?>/P>

在C或C+中设置断点+;在Linux上以编程方式为gdb编写代码 > >如何在C或C++代码中设置断点,这将对Linux上的GDB工作?>/P>,c++,c,linux,gdb,C++,C,Linux,Gdb,即: 通过观察,我发现了以下方法: void main(int argc, char** argv) { asm("int $3"); int a = 3; a++; // In gdb> print a; expect result to be 3 } 这对我来说似乎有点刻薄。我认为这只适用于x86体系结构。一种方法是发出中断信号: #include <csignal> // Generate an interrupt std::raise(

即:

通过观察,我发现了以下方法:

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

这对我来说似乎有点刻薄。我认为这只适用于x86体系结构。

一种方法是发出中断信号:

#include <csignal>

// Generate an interrupt
std::raise(SIGINT);
#包括
//产生中断
标准:上升(SIGINT);
在C中:

#包括
升起(SIGINT);

更新:Windows并不真正支持
SIGINT
,因此,如果考虑到可移植性,您最好使用
SIGABRT
,在我从事的项目中,我们会这样做:

raise(SIGABRT);  /* To continue from here in GDB: "signal 0". */
(在我们的例子中,如果这种情况发生在调试器之外,我们希望发生严重崩溃,如果可能的话,生成崩溃报告。这是我们使用SIGABRT的一个原因。在Windows、Mac和Linux上实现这一点进行了几次尝试。我们最后得到了一些“ifdef”,在这里给出了有益的评论:)

\u asm\uuuu(“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上可能是相同的)

看到如此多的答案没有使用软件断点的专用信号,
SIGTRAP
,令人失望:

#包括
升起(信号陷阱);//在BP的位置。


在MSVC/MinGW上,您应该使用
DebugBreak
,或者
\uu DebugBreak
内部命令。一个简单的
#ifdef
可以处理这两种情况(POSIX和Win32)。

是的,这应该可以跨操作系统/编译器/调试器工作。我不知道其他调试器,但gdb在这方面非常灵活。我们发现在一些Unicesin Windows、MSVC上SIGTRAP更好。您可以使用u debug_break、DebugBreak或asm{int 3}@FernandoGonzalezSanchez:实际上函数名是
\uuuu debugbreak()
,而不是
\uuuu debug\u break()
,正如您所看到的,并且只有编译器支持AT&T汇编语法。特别是,Microsoft的编译器(
cl.exe
)不支持此语法,但使用了不同的语法。问题是关于linux的,所以我想我们可以假设gcc语法适用于x86.BTW-我在x86机器上尝试了上述方法,确实有效。我很好奇是否有更好的方法。看起来有。我正在windows上使用mingw,所以其他建议对我没有帮助。提升SIGINT信号只是终止应用程序,SIGTRAP未在mingw标头中定义。。。使用int指令实际上会发送SIGTRAP,gdb会在适当的行上很好地中断。在Linux中,
int3
会引发SIGTRAP。这是一个旁注(很抱歉吹毛求疵),但是如果你担心可移植性,那么你可能也担心正确性-因此
intmain
而不是
voidmain
@Stuart-修复了。不久前就应该这样做。@J.Polfer:
返回0
不是必需的,只是噪音!像往常一样,windows与其他窗口不同:)是否可以发出“信号0”以继续在暂停状态下对程序进行编程?从现在开始,如果能够使用“n”或“s”,而不发出“c”,那就太好了。@JasonDoucette如果您真的只想让程序暂停,您可能需要在程序中添加一个
breakpoint()
函数(它可以是空的,也可以只包含一个print语句)并将
中断断点
添加到您的
~/.gdbinit
中。我想
#定义这个
,这样我就不必记住语法了。我把它散布在我的代码中,有时代替
assert()
,因为停止debiugger让我检查所有变量&堆栈。当然,像assert一样,我不必为了生产代码而删除它,有趣的是,当“Linux”和“GDB”的问题约束给出了除诉诸汇编之外的许多选择时,这有10个投票权,而汇编应该始终是为了可移植性的最后手段,如果没有其他选择的话。请查看其他答案。哪个库?这是标准C++库的一部分,是跨平台的C++ 11编译器。但是,这会引发SIGABRT,在本例中,这不是一个真正合适的引发信号。某些平台(例如Msys2)没有定义
SIGTRAP
raise(SIGABRT);  /* To continue from here in GDB: "signal 0". */
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;
}