【问题标题】:How to get GDB to stop on an assertion failure?如何让 GDB 在断言失败时停止?
【发布时间】:2016-02-14 00:11:21
【问题描述】:

我正在开发一个包含许多断言的项目(应该如此)。问题是,我不能让 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 接受并将所有这些作为活动断点列出。 无论如何,没有休息,只是一个很好的“断言失败......”消息并且程序停止...... 提前致谢, 最好的问候,戴夫

【问题讨论】:

    标签: gdb gcc4


    【解决方案1】:

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

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

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

    并在 GDB 下运行它。

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

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

    (只需将上面的代码链接到您的主可执行文件中,它应该“抢占”__assert_faillibc.so 副本。)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-23
      • 1970-01-01
      • 2022-01-09
      • 2016-12-15
      • 1970-01-01
      相关资源
      最近更新 更多