我使用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发布于 2012-10-31 07:00:31
您的应用程序按预期工作。断言失败(因为传递给它的值不相等,assert宏接收0),因此程序被中止。这就是断言的工作方式:
如果未定义NDEBUG,则断言检查其参数(必须具有标量类型)是否等于零。如果是这样的话,断言将输出标准错误输出的特定于实现的诊断信息,并调用std::。
强调我的。
有关更多信息,请查看此断言引用。
发布于 2016-05-06 05:08:08
我只是在尝试调试Raspberry Pi上的程序时遇到了这个错误。程序使用GPIO的方式恰好要求程序以root身份运行。例如,我以如下方式运行我编写的程序:
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希望这对同舟共济的人有帮助。
发布于 2012-10-31 07:10:27
这将使您了解有关使用断言函数的最新情况。
void assert (int expression);如果此宏的参数表达式与函数形式比较等于零(即表达式为false),则计算断言,将消息写入标准错误设备,并调用abort,从而终止程序的执行。
所显示的消息的具体内容取决于编译器中的特定实现,但它应该包括:断言失败的表达式、源文件的名称以及它发生的行号。一种常见的表达式格式是:
断言失败:表达式、文件文件名、行号--这个宏是禁用的,如果此时包含的是一个名为NDEBUG的宏。这允许编码器在调试程序时将许多断言调用包含在源代码中,然后通过简单地包括如下一行来禁用所有这些调用用于生产版本:
#define NDEBUG at the beginning of its code, before the inclusion of assert.h.因此,此宏设计用于捕获编程错误,而不是用户或正在运行的错误,因为通常在程序退出调试阶段后才禁用它。来自:C++参考文献
https://stackoverflow.com/questions/13152775
复制相似问题