我正在开发一个包含许多断言的项目(应该如此)。问题是,我不能让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接受并将所有这些列为活动断点。 无论如何,没有休息,只是一个很好的“断言失败...”消息,程序停止... 提前致谢, 最诚挚的问候,戴夫
答案 0 :(得分:3)
问题是,我无法让GDB打破断言失败
通常,您不必执行任何:setBackgroundColor
将abort
发送到进程,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附加到它。