2012-09-07 66 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