Утечка памяти, сообщенная valgrind в dlopen?
в последнее время я отлаживаю некоторые приложения с valgrind, и я получаю очень странные отчеты от dlopen
.
==1987== 32 bytes in 1 blocks are still reachable in loss record 1 of 2
==1987== at 0x4C24477: calloc (vg_replace_malloc.c:418)
==1987== by 0x570F31F: _dlerror_run (dlerror.c:142)
==1987== by 0x570EEE0: dlopen@@GLIBC_2.2.5 (dlopen.c:88)
<my call to dlopen>
==1987==
==1987== 264 bytes in 1 blocks are still reachable in loss record 2 of 2
==1987== at 0x4C25153: malloc (vg_replace_malloc.c:195)
==1987== by 0x400CD44: _dl_map_object_deps (dl-deps.c:506)
==1987== by 0x4012DA2: dl_open_worker (dl-open.c:326)
==1987== by 0x400E385: _dl_catch_error (dl-error.c:178)
==1987== by 0x40126C6: _dl_open (dl-open.c:615)
==1987== by 0x570EF65: dlopen_doit (dlopen.c:67)
==1987== by 0x400E385: _dl_catch_error (dl-error.c:178)
==1987== by 0x570F2AB: _dlerror_run (dlerror.c:164)
==1987== by 0x570EEE0: dlopen@@GLIBC_2.2.5 (dlopen.c:88)
<my call to dlopen>
Это похоже на сообщение об ошибке, инициализированное для dlerror
, но глядя на man-странице, это ничего не говорит о том, как это должно быть очищено. Есть идеи, как правильно от этого избавиться?
3 ответов
удалось воспроизвести эту проблему с некоторым кодом "hello world", который даже не вызывает никаких символов в загруженном объекте. http://pastebin.com/d690bea57
Я предполагаю, что это ошибка в libc или valgrind. Воспроизводимый на Ubuntu 9.04 и Scientific Linux 5.3 (20 и 32 байта соответственно).
EDIT (by Calmarius):
этот тривиальный код, воспроизводящий проблему:
#include <dlfcn.h>
int main()
{
void* handle = 0;
handle = dlopen("libm.so", RTLD_NOW);
dlclose(handle);
return 0;
}
при компиляции с этим команда:
gcc -Wl,--no-as-needed -g -o stuff main.c -ldl -lpthread
даже последний valgrind 3.11 может воспроизвести это на Ubuntu 14.04
апстрим баг сообщалось: https://bugs.kde.org/show_bug.cgi?id=358980
это подавление лучше:
{
Ignore dlopen bug.
Memcheck:Leak
...
fun:_dl_open
...
}
(заметим, что "..."является частью подавления и должен быть введен буквально.)
Я видел это сам во всех видах libs, используя dlopen или нет. Я просто предположил, что это была какая - то магическая реализация в libs, которая обманула valgrind - или-эти libs на самом деле имеют утечки памяти, и в этом случае я ничего не могу сделать в мой app.