如何让GDB停止断言失败?

时间:2016-02-14 00:11:22

标签: 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

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

1 个答案:

答案 0 :(得分:3)

  

问题是,我无法让GDB打破断言失败

通常,您不必执行任何setBackgroundColorabort发送到进程,GDB默认捕获该进程。您应该能够通过编译此测试用例来确认这一点:

SIGABRT

并在GDB下运行。

问题的最可能原因是您正在调试错误的进程,而不是实际中止的进程。也许是子进程实际上没有断言?

GDB #include <assert.h> int main() { assert(0 == 1); return 0; } 可能会有所帮助。

另一种调试方法是将标准set 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*/; } 的{​​{1}}副本。)

现在当断言失败时,进程将永远旋转而不是死于libc.so,这将允许您找到它(例如__assert_fail)并使用GDB附加到它。