debugging c ++:../ nptl / sysdeps / unix / sysv / linux / raise.c:没有这样的文件或目录

时间:2012-10-31 06:58:27

标签: c++ gdb

我正在使用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

3 个答案:

答案 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

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