Заранее благодарим за прочтение этого вопроса. Наша программа столкнулась со странной проблемой: "dlsym" время от времени выдает ошибку "сегментный сбой". Фон состоит в том, что наш движок загружает несколько общих библиотек в один процесс и сохраняет дескриптор этих библиотек, полученный от "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]
В настоящее время мы работаем над этим и очень признательны, что вы можете дать нам какое-то направление.
Спасибо
gdb
, чтобы узнать изcore
файла значениеhandler
иfunctionName
вdlsym
. - person Lorinczy Zsigmond   schedule 10.03.2019