“ dlsym”偶尔会引发“段故障”问题

时间:2019-03-10 08:58:52

标签: sigsegv dlopen dlsym

预先感谢您阅读此问题。 我们的程序遇到一个奇怪的问题,“ dlsym”偶尔会引发“ segment fault”问题。 背景是,我们的引擎将多个共享库加载到一个进程中,并将该库的句柄(从“ dlopen”中获取)存储到地图中,

 void* handler = dlopen(libraryPath, RTLD_NOW);
if (handler != NULL) {
  handlerStore[libraryPath] = handler;
} else {
  throw exception
}

然后使用下面的代码调用这些库中的函数

void* handler = handlerStore[toStr(libraryPath)];
typedef int (*function)(); // the function to be called
dlerror(); /**clear error code*/

function f = (function) dlsym(handler, functionName);
char *error = dlerror();
if (error != NULL || f == NULL) {
  throw exception
}

int state_out = 0;
if (f != NULL) {
  try{
    state_out = (*f)();
  }catch (...){
    throw exception
  }

奇怪的行为是,它在大多数情况下都有效,但是偶尔会在下面的堆栈跟踪中引发段错误错误。

/lib64/libc.so.6(+0x35270)[0x7f807d4c0270]
/lib64/ld-linux-x86-64.so.2(+0x94b0)[0x7f80808fd4b0]
/lib64/ld-linux-x86-64.so.2(+0x9cfb)[0x7f80808fdcfb]
/lib64/ld-linux-x86-64.so.2(+0x9fdf)[0x7f80808fdfdf]
/lib64/libc.so.6(+0x133e29)[0x7f807d5bee29]
/lib64/libdl.so.2(+0x10d4)[0x7f807c3420d4]
/lib64/ld-linux-x86-64.so.2(+0xf314)[0x7f8080903314]
/lib64/libdl.so.2(+0x15bd)[0x7f807c3425bd]
/lib64/libdl.so.2(dlsym+0x48)[0x7f807c342128]

我们目前正在为此奋斗,非常感谢您可以给我们一些指导

谢谢

1 个答案:

答案 0 :(得分:0)

  

“ dlsym”偶尔会引发“段故障”问题。

由于您的程序使用异常,因此应更仔细地使用术语throwdlsym是在纯C语言中实现的,并且不会抛出任何东西。

但这raise的{​​{1}}信号。

SIGSEGV引发dlsym的最可能原因是堆损坏,而捕获此类损坏的最佳工具是Address Sanitizer(如果使用最新的GCC,请使用SIGSEGV构建或Clang)或Valgrind