"dlsym" время от времени выбрасывает проблему "ошибка сегмента" - PullRequest
0 голосов
/ 10 марта 2019

Заранее спасибо за чтение этого вопроса. В нашей программе возникла странная проблема: 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]

В настоящее время мы боремся с этим и очень ценим, что вы можете дать нам некоторое направление

Спасибо

1 Ответ

0 голосов
/ 10 мая 2019

"dlsym" вызывает проблему "ошибки сегмента" время от времени.

Поскольку ваша программа использует исключения, вам следует использовать термин throw более осторожно: dlsym реализован вpure-C, и не бросает что-либо.

Но это raise s SIGSEGV сигнал.

Наиболее вероятная причина для dlsym повышения SIGSEGV - это повреждение кучи, и лучшими инструментами для обнаружения такого повреждения являются Address Sanitizer (сборка с -fsanitize=address при использовании последних GCC или Clang) или Valgrind .

...