簡體   English   中英

debugging c ++:../ nptl / sysdeps / unix / sysv / linux / raise.c:沒有這樣的文件或目錄

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

我正在使用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,則斷言檢查其參數 (必須具有標量類型) 是否等於零。 如果是,則斷言輸出標准錯誤輸出的特定於實現的診斷信息,並調用std :: abort

強調我的。

檢查此斷言參考以獲取更多信息。

這應該可以讓您快速了解使用斷言功能

void assert (int expression);

評估斷言如果具有函數形式的此宏的參數表達式比較等於零(即表達式為false),則會將消息寫入標准錯誤設備並調用abort,從而終止程序執行。

顯示的消息的細節取決於編譯器中的特定實現,但它應包括:斷言失敗的表達式,源文件的名稱以及發生它的行號。 通常的表達格式是:

斷言失敗:表達式,文件文件名,行行號如果在包含已定義名稱為NDEBUG的assert.ha宏時,則禁用此宏。 這允許編碼器在調試程序時在源代碼中包含許多斷言調用,然后通過簡單地包括如下行來禁用生產版本的所有這些調用:

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

因此,此宏旨在捕獲編程錯誤,而不是用戶或運行錯誤,因為它通常在程序退出調試階段后被禁用。 來自: C ++ Ref

我在嘗試調試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

希望這對同一條船上的某個人有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM