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

我如何在 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;
}
101388 次浏览

通过查看 给你,我发现了以下方法:

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

C:

#include <signal.h>
raise(SIGINT);

更新 : 微软文档说 Windows 并不真正支持 SIGINT,所以如果考虑到可移植性,那么使用 SIGABRT可能更好。

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

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

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

__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 上可能也是这样)

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

#include <signal.h>


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

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