2011-06-25 76 views
0

我有一個很奇怪的問題,已經花了幾個小時,我的注意力時:SIGABRT試圖拋出一個異常

隨着給人一種錯誤輸入到軟件我的工作,我可以產生一個異常(這當然是有意的)。這工作正常,我看到一個正確的錯誤消息執行該程序時。 但是,當我通過完全相同的輸入API(產生幾乎相同的控制流)時,程序崩潰。調試我看到下面的(我用於調試GDB):

  • Exception類(在這種情況下,所謂的UserExcption這個類沒有虛方法以及它的前輩沒有任何虛方法)成功獲取實例化。
  • 當我一步「到throw語句」(要說的是,我只是繼續加強異常對象實例化後)我得到以下的輸出:

(GDB)■

純虛擬方法稱爲

編程接收信號SIGABRT,中止。

在__pthread_kill 0x00007fff95c64ce2()

(GDB)

我真的不明白這裏發生了什麼。從現在開始虛擬方法(就我所知)而言,我也無法想象,有一些懸掛指針或類似的東西(否則我希望得到一個空指針異常)。由於整個程序相當大,我不知道在哪裏尋找問題,我也無法複製它。

有沒有人有一個想法這種行爲的來源可能是什麼?

最佳馬庫斯

+0

後堆棧跟蹤('bt') –

+0

https://docs.google.com/document/pub?id=1jgXhSmlUcGWf-ZsfM18LDOScBEc4IWIUKrozY2BS1xM - 兩個堆棧(throw語句之前幷包括後) –

+0

你有虛擬呼叫在'zorba :: UDFunctionCallIteratorState ::〜UDFunctionCallIteratorState'? –

回答

2

我不知道你在呼喚,無論是從構造函數和析構函數,或者可能有些投走錯了一些(不是純)虛方法。我猜你應該在你的異常類中檢查這個,因爲在拋出它的一個實例的時候你會得到錯誤。

事實上,編譯器會阻止你使用未實現的純虛函數的類。另一方面,虛函數多態在構造函數和析構函數中並不完全安全。

只是一個建議,但沒有看到代碼,這只是一個假設。

我也會做一個乾淨的構建,也許你有一些陳舊的對象出於某種原因。

+0

我現在做了一個乾淨的構建,這解決了問題!我不明白這一點 - 這是一個錯誤的地方? (如我們的構建系統,cmake甚至編譯器/鏈接器)。你有任何想法如何發生?無論如何:非常感謝答案! –

+0

我認爲它與一些編譯器/鏈接器優化錯誤的方式有關。原則上根本不應該發生;儘管它發生了。 – sergio