2012-06-22 223 views
14

你能告訴我什麼可能會導致C++ SIGABRT錯誤?什麼導致SIGABRT錯誤?

+2

好一點!! :)我試圖尋找了它說,它發送到從編譯器中止過程中對系統的信號,但我的編譯器並沒有說這部分是造成這一不尋常行爲,對n向下箭頭,我詢問可能的原因。我的代碼長度爲500行。 – user1444426

+0

@ user1444426 - 在調試模式下編譯(使用g ++的-g),使用dbx,它會發現問題。 –

+1

@Ecatmur,維基百科頁面並不是那麼有用。它所說的只是「放棄」提出了這個信號,但它並沒有超出這個範圍。我有時會在程序中獲得'SIGABRT'信號,但我從未*直接調用過'abort'。 –

回答

8

這通常發生在庫遇到內部錯誤時,所以它們調用abort(),因爲它們不能繼續。當你覆蓋它的一個數據結構時(例如屬於libc的函數),可能會發生這種情況。所以這可能是例如libc調用,因爲你確實覆蓋了一些東西。然後應用程序必須終止,因爲不可能繼續或處理它,這被稱爲失敗的斷言。

10

Wikipedia

SIGABRT由處理時它調用abort libc函數,在stdlib.h定義發送給自身。 SIGABRT信號可以被捕獲,但不能被阻止;如果信號處理程序返回,則所有打開的流都關閉並刷新,程序終止(如果適用,則轉儲內核)。這意味着abort調用永不返回。由於這一特點,它常常用於表示支持庫中的致命條件,即當前操作無法完成但主程序可在退出之前執行清理的情況。它在斷言失敗時使用。

這意味着,如果你的代碼是不是直接調用abort也不能通過raise將自身發送的信號SIGABRT,而你沒有任何失敗的斷言,原因必須是一個支持庫(可以是libc中)遇到內部錯誤。如果您提供程序的詳細信息,我們可能會提出可能的原因。更妙的是,如果您檢查覈心或在調試器中運行程序,您應該能夠收集堆棧跟蹤,這將顯示哪個庫導致程序中止。

(這也可能是您的系統上的其它程序發送程序SIGABRT,但是這是在大多數情況下難以察覺的可能性很小。)

3

在實踐中,這通常是由斷言宏觸發:

char* foo = NULL; 
assert(foo != NULL); 

會導致SIGABRT