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

J. *_*fer 93 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;
}
Run Code Online (Sandbox Code Playgroud)

Håv*_*d S 93

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

#include <csignal>

// Generate an interrupt
std::raise(SIGINT);
Run Code Online (Sandbox Code Playgroud)

在C:

#include <signal.h>
raise(SIGINT);
Run Code Online (Sandbox Code Playgroud)

更新:MSDN声明 Windows并不真正支持SIGINT,所以如果可移植性是一个问题,你可能最好不要使用SIGABRT.

  • 我们在一些Unices上找到了更好的SIGTRAP (4认同)
  • @FernandoGonzalezSanchez:实际上函数名是`__debugbreak()`和*NOT*`__debug_break()`,你可以看到[这里](https://msdn.microsoft.com/it-it/library/f408b4et.aspx ) (2认同)

Jas*_*rff 26

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

raise(SIGABRT);  /* To continue from here in GDB: "signal 0". */
Run Code Online (Sandbox Code Playgroud)

(在我们的例子中,如果这发生在调试器外部,我们想要崩溃,如果可能的话会生成崩溃报告.这就是我们使用SIGABRT的一个原因.在Windows,Mac和Linux上进行多次尝试.我们最终得到了一些. #ifdefs,在这里有帮助评论:http://hg.mozilla.org/mozilla-central/file/98fa9c0cff7a/js/src/jsutil.cpp#l66.)

  • 像往常一样窗户看起来不像其他人:) (2认同)
  • @JasonDoucette如果您真的只是想让程序暂停,则可能需要在程序中添加一个`breakpoint()`函数(可以为空或只包含一个打印语句),然后将`break breakpoint`添加到您的〜/中。 .gdbinit`。 (2认同)

J. *_*fer 22

通过这里看,我发现了以下方式:

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

这对我来说似乎是一种触动.我认为这只适用于x86架构.

  • 并且只有编译器支持AT&T汇编语法.特别是,Microsoft的编译器(`cl.exe`)不支持此语法,但使用不同的语法. (3认同)
  • 我在windows上使用mingw所以其他建议无法帮助我.提升SIGINT信号只是终止应用程序,未在mingw头中定义SIGTRAP ...使用int指令实际上发送SIGTRAP并且gdb在相应的行上很好地中断. (2认同)

Ben*_*Tut 16

令人失望的是,看到这么多答案没有使用软件断点的专用信号,SIGTRAP

#include <signal.h>

raise(SIGTRAP); // At the location of the BP.
Run Code Online (Sandbox Code Playgroud)

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


hek*_*mgl 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;
}
Run Code Online (Sandbox Code Playgroud)

  • 有趣的是,当“Linux”和“GDB”的问题限制提供了除了求助于汇编之外的大量选择时,这有 10 票赞成,如果没有别的办法,为了可移植性,汇编应该始终是最后的手段。请参阅其他一些答案。 (3认同)
  • @Ralph `int $3` 只是 x86 系统上的“其背后的内容”,问题没有指定...... (2认同)