21

gdb用来调试C++程序。在行

assert(prevId ==  GetTagIdFromState(maxState));
  • 参数prevId值为0
  • 方法GetTagIdFromState(maxState) returns 50;

调试时,我收到以下错误。

Assertion `prevId == GetTagIdFromState(maxState)' failed.
Program received signal SIGABRT, Aborted.
0x00007ffff6ecbba5 in raise (sig=<value optimized out>) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
64    ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory.
      in ../nptl/sysdeps/unix/sysv/linux/raise.c
4

3 回答 3

10

您的应用程序按预期工作。断言失败(因为您传递给它的值不相等,assert宏接收 0),因此您的程序被中止。这就是断言的工作方式:

如果未定义 NDEBUG,则assert 检查其参数(必须具有标量类型)比较为零。如果是,则 assert 在标准错误输出上输出特定于实现的诊断信息并调用 std::abort

强调我的。

检查此断言参考以获取更多信息。

于 2012-10-31T07:00:31.980 回答
2

我在尝试在 Raspberry Pi 上调试程序时遇到了这个错误。该程序碰巧以要求程序以 root 身份运行的方式使用 GPIO。例如,我运行我编写的程序是这样的:

sudo ./foo

但是,我在启动调试器时忘记了这一点,并尝试了

gdb foo

我得到了你似乎遇到的错误:

Program received signal SIGABRT, Aborted.
0x76cd0f70 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
56  ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory.

当我使用 sudo 运行它时,它运行良好。

sudo gdb foo

希望这对同一条船上的人有所帮助。

于 2016-05-06T05:08:08.153 回答
0

这应该让您快速了解使用断言功能

void assert (int expression);

评估断言 如果这个函数形式的宏的参数表达式比较等于零(即表达式为假),则将一条消息写入标准错误设备并调用中止,终止程序执行。

显示的消息的细节取决于编译器中的具体实现,但它应包括:断言失败的表达式、源文件的名称以及它发生的行号。通常的表达式格式是:

断言失败:表达式、文件文件名、行号 如果在包含名为 NDEBUG 的 assert.ha 宏时,该宏已被定义。这允许编码人员在调试程序时在源代码中包含许多断言调用,然后通过简单地包含如下行来禁用所有这些调用以用于生产版本:

#define NDEBUG at the beginning of its code, before the inclusion of assert.h.

因此,该宏旨在捕获编程错误,而不是用户或运行错误,因为它通常在程序退出其调试阶段后被禁用。来自:C++ 参考

于 2012-10-31T07:10:27.937 回答