我正在使用gdb
来调试C++
程序。在行
assert(prevId == GetTagIdFromState(maxState));
prevId
的值为0
; GetTagIdFromState(maxState)
return
s 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
答案 0 :(得分:9)
您的应用程序按预期工作。断言失败(因为传递给它的值不相等,assert
宏接收0),因此您的程序正在中止。这就是断言的工作方式:
强调我的。如果未定义NDEBUG,则断言检查其参数是否(其中 必须有标量类型)比较等于零。如果确实如此,断言 输出关于标准的特定于实施的诊断信息 错误输出并调用std :: abort 。
查看this assert reference以获取更多信息。
答案 1 :(得分:0)
这可以让您快速了解使用断言功能
void assert (int expression);
评估断言 如果具有函数形式的此宏的参数表达式比较等于零(即表达式为false),则会将消息写入标准错误设备并调用abort,从而终止程序执行。
显示的消息的细节取决于编译器中的特定实现,但它应包括:断言失败的表达式,源文件的名称以及发生它的行号。通常的表达格式是:
断言失败:表达式,文件文件名,行号 如果在包含assert.h时已禁用此宏,则已定义名为NDEBUG的宏。这允许编码器在调试程序时在源代码中包含许多断言调用,然后通过简单地包括如下行来禁用生产版本的所有调用:
#define NDEBUG at the beginning of its code, before the inclusion of assert.h.
因此,此宏旨在捕获编程错误,而不是用户或运行错误,因为它通常在程序退出调试阶段后被禁用。 来自:C++ Ref
答案 2 :(得分:0)
我在尝试调试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
希望对同一条船上的某人有所帮助。