2009-06-17 35 views
4

我有一個名爲ftest的測試程序。它加載包含測試的.so文件,並運行它在其中找到的測試。其中一個測試加載並運行一個.so,其中包含一個用於我們的O/RM的Postgres數據庫驅動程序。來自共享對象(.so)的Linux上的異常

當Postgres驅動程序拋出在.so文件中定義的異常(或者它鏈接到的但ftest沒有鏈接到的)並被測試框架捕獲時,異常析構函數會觸發段錯誤。

這段錯誤發生時編譯的例外是在已經動態加載(使用進入dload)一個.so。

這種事情在Windows具有相同的體系結構正常工作。我們並不想限制自己只使用來自核心庫的異常 - 插件應該可以自由地創建自己的異常類並使它們正常處理。

異常是std :: exception的子類。有時可能會在庫中定義異常(如libpqxx),這意味着異常有時也不受我們的控制。

異常被拋出使用類似:

throw exception_class(exception_arguments); 

而且使用被發現:

catch (std::exception &e) { 
    // handler code 
} 

有沒有得到這個工作需要一些特殊的編譯器選項?我們是否需要切換到通過throw new exception_class(args)(我們不是真的想這樣做)拋出異常?

回答

6

假設你使用gcc -

追加-Wl,-E當您生成可執行文件調用dlload()。這會從可執行文件中導出所有類型的信息符號,這將允許RTTI(捕獲異常時)正常工作。

VC++使用字符串進行比較,以匹配所屬類別,導致較慢的dynamic_cast <>等,但更小的二進制文件。 g ++使用指針比較。

我嘗試使用以.so加載運行時實現純虛接口的類時遇到了同樣的問題。

有一些與主題漂浮在網絡上還有幾篇文章。

希望幫助, 海曼。

+0

它實際上是具有問題的析構函數不是捕獲。如果它是虛擬表的位置,我不會感到驚訝 - 也許.so不會爲表加載的頁面提供讀取權限,因此無法讀取析構函數。儘管這是純粹的猜測。 我會看看我是否可以解決如何通過Boost.Build設置這些選項。 – KayEss 2009-06-17 09:27:01