[英]vfork()../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory
[英]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.