2012-09-07 79 views
-1

如何捕捉我的代碼中的符號查找錯誤,所以目前我的程序崩潰?如何捕捉符號查找錯誤

void main() 
{ 
    try { 
    dlopen("shared.so", RTLD_LAZY); 
    /** 
     now running a function in this shared object and 
     this function calls a undefined reference 
     and then it crashes but i want to go in the catch block 
    */ 
    } catch(...) { 
    } 
} 
+0

10 ..如何檢查返回值? – SuperSaiyan

+0

它只是一個簡短的代碼片段dlopen返回一個有效的句柄,並且這個共享對象中的函數運行良好,直到unreferenced被稱爲 – helmi

+3

'void main'?在2012年? – Flexo

回答

5

dlopenC功能。它不會拋出任何exception

void *dlopen(const char *filename, int flag); 

man dlopen

如果dlopen的()由於某種原因失敗,則返回NULL。

因此,檢查返回值爲NULL

因此,對於檢查,該符號存在,你應該使用

void *dlsym(void *handle, const char *symbol); 

如果沒有找到符號,在指定庫或任何被自動的dlopen加載庫 的()當該庫被加載時,dlsym()返回NULL。 (由dlsym() 執行的搜索首先通過這些庫的依賴關係樹進行廣泛搜索。)由於符號的值實際上可能爲NULL(因此從dlsym()返回的NULL不需要指示錯誤),因此,測試錯誤的正確方法是調用dlerror()來清除任何舊的錯誤條件,然後調用dlsym(),然後再次調用dlerror(),將其返回值保存到變量中,並檢查是否保存了 值不是NULL

+0

不,它不會失敗,因爲它只是失敗,如果我打電話給未參考的功能,並且有時可能發生 – helmi

+0

@helmi看到更新。 – ForEveR

+0

它不是不真實的shared.so使用不能在另一個lib或主程序中實現的函數,所以只要你調用shared.so中的函數,dlopen就會提供一個有效的句柄,它無法找到然後崩潰 – helmi