如何让 GDB 在断言失败时停止?

Dav*_*ler 5 gdb gcc4

我正在开发一个包含许多断言(应该如此)的项目。问题是,我无法让 GDB 在断言失败时中断;它只是打印一个很好的断言失败消息并中止程序。根据我之前添加的帖子,但无济于事,以下断点:

break g_log if log_level == G_LOG_LEVEL_CRITICAL
break g_log if log_level == G_LOG_LEVEL_WARNING
break __assert
break _assert
break abort
break exit
break __assert_fail
Run Code Online (Sandbox Code Playgroud)

GDB 接受并列出所有这些作为活动断点。无论如何,没有休息,只是一个很好的“断言失败......”消息并且程序停止......提前致谢,最好的问候,戴夫

Emp*_*ian 5

问题是,我无法让 GDB 在断言失败时中断

通常,您无需执行任何操作abort发送SIGABRT到 GDB 默认捕获的进程。您应该能够通过编译此测试用例来确认这一点:

#include <assert.h>
int main() { assert(0 == 1); return 0; }
Run Code Online (Sandbox Code Playgroud)

并在 GDB 下运行它。

问题的最可能原因是您调试了错误的进程,而不是实际中止的进程。也许是子进程实际上使断言失败了?

GDBset follow-fork-mode可能会在这里提供帮助。

另一种调试方法是将标准替换为__assert_fail

#include <stdio.h>
int foo;
void __assert_fail(const char *assertion, const char *file, int line,
                   const char *function)
{
  fprintf(stderr, "MY assertion failed: %s in %s, %s:%d\n",
          assertion, function, file, line);
  while (foo == 0) /*spin*/;
}
Run Code Online (Sandbox Code Playgroud)

(上面的代码只是链接到主可执行文件,它应该“抢占”的libc.so副本__assert_fail。)

现在,当断言失败时,该过程将永远旋转而不是随着 死亡SIGABRT,这将允许您找到它(在 eg 中top)并使用 GDB 附加到它。