2016-02-14 96 views
3

我正在研究一个包含许多断言的项目(因为它应该)。问题是,我无法让GDB断言断言失败;它只是打印一个很好的断言失败消息并中止程序。根据之前发布的帖子,我无意中发现以下几个断点:如何让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接受并列出所有这些为活动断点。 无论如何,没有休息,只是一个漂亮的“断言失败...”的消息,并在程序停止...提前 感谢, 最好的问候,戴维

回答

3

问题是,我不能让GDB到在一个断言失败

通常打破,你不必做任何事情abort发送SIGABRT的过程,GDB捕捉默认。你应该能够通过编译这个测试用例来确认这一点:

#include <assert.h> 
int main() { assert(0 == 1); return 0; } 

并在GDB下运行它。

你的问题的最可能的原因是,你正在调试错误的过程,而不是实际中止之一。也许这是孩子的过程,实际上失败了断言?

的GDB set follow-fork-mode这可能有所帮助。

的另一种方式,你可以调试即是通过与更换标准__assert_fail:(上面的代码只是链接到你的主执行程序,它应该“先占”的__assert_faillibc.so复印件)

#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*/; 
} 

现在

时断言失败,该进程将永远自旋,而不是与SIGABRT死亡,这将让你找到它(在如top)和附加到它与GDB。