2011-05-26 48 views
2

我也遇到過其中存在以下可能性不大代碼一個奇怪的場景:未捕獲的異常 - 調試運行技術(C++)

try{ 
    throw Core::ValueError(); 
} 
catch (Core::Error &e){ 
    ... 
} 

導致(ValueError異常與錯誤繼承的std ::例外繼承)如果編譯到可執行文件中,則會捕獲異常,但如果編譯到特定的共享庫中則不會。

所以我的問題:

  1. 什麼樣的調試工具和/或技術,我可以使用黑盒是異常處理過程裏面偷看?我可以用gdb來完成它嗎?

  2. 是否有任何信息可以從Mach-o標題中提取出來,告訴我有關某些catch子句的某些例外情況(如果您願意的話)的任何可能性?特別是,我可以在「gcc_except_tab」部分看看它可愛的LSDA或符號表或其他部分,並推斷出符號可見性或與捕獲異常相關的其他問題的任何問題嗎?

我確實發現聲稱使用雞,七個老鼠尾巴和粒子加速器解決方案的在線資源,但我想我會先試的StackOverflow離開魔法作爲最後的手段。

(我運行的i686-蘋果darwin10-G ++ - 4.2.1 OSX 10.6.7)

所有幫助表示讚賞。 謝謝!

+0

發佈一個完整的,最小的示例來演示問題。我嘗試將該代碼編譯爲共享庫,並且按預期捕獲異常。 – 2011-05-27 01:32:56

+0

是的,我得到了一個簡單的重建嘗試的結果(異常被捕獲)。所以現在我有一個簡單的例子,一個複雜的例子,但不是比較它們的工具。我開始從原始代碼中刪除部分,以儘量減少它,但仍然在複製問題,但我仍在處理一個黑盒 - 我想知道更多。 – 2011-05-28 06:46:24

回答

2

你正在扔一個臨時對象,所以你應該catch(Core::Error const& e)