繁体   English   中英

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

[英]Set breakpoint in C or C++ code programmatically for gdb on Linux

如何以编程方式在 C 或 C++ 代码中设置适用于 Linux 上的 gdb 的断点?

IE:

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);

更新Microsoft Docs表示 Windows 并不真正支持SIGINT ,因此如果担心可移植性,您最好使用SIGABRT

任何 Win32 应用程序都不支持 SIGINT。 当发生 CTRL+C 中断时,Win32 操作系统会生成一个新线程来专门处理该中断。 这可能导致单线程应用程序(例如 UNIX 中的应用程序)变为多线程并导致意外行为。

通过查看here ,我找到了以下方法:

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

这对我来说似乎有点骇人听闻。 而且我认为这只适用于 x86 架构。

在我从事的一个项目中,我们这样做:

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 。)

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

#include <signal.h>

raise(SIGTRAP); // At the location of the BP.

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

__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;
}

在 OS X 上,您可以调用std::abort() (在 Linux 上可能相同)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM