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

debugging c++ : ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory

本文关键字:文件 raise sysdeps nptl unix sysv 调试 linux      更新时间:2023-10-16

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

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

如果未定义ndebug,则 servert检查其参数是否(哪个 必须具有标量类型)比较等于零。如果这样做,请断言 输出有关标准的特定于特定诊断信息 错误输出并调用std :: Aport

强调我的。

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

我只是在试图在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

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

这应该使您迅速使用assert函数

void assert (int expression);

评估断言如果该宏的参数表达式具有函数表格的比较等于零(即表达式为false),则将消息写入标准错误设备并流产,终止程序执行。

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

断言失败:表达式,文件文件名,行号号码如果在包括essert.h的那一刻,该宏已被禁用。这使编码器在调试程序时可以在源代码中包含许多断言呼叫,然后通过简单地包括一个类似的行,将所有呼叫都禁用到生产版本中。

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

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