Как найти причину утечки памяти с помощью Leak Sanitizer

У меня есть программа на C++, использующая tbb, я компилирую на 64-битном Linux с GCC 6.2.1. Когда я компилирую с дезинфицирующим средством адреса (-fsanitize = адрес) и запускаю модульные тесты, генерируется этот вывод:

...
[  PASSED  ] 56 tests.

=================================================================
==12326==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 54 byte(s) in 3 object(s) allocated from:
    #0 0x7f4c634fd020 in strdup (/usr/lib64/libasan.so.3+0x58020)
    #1 0x301d215bb4  (/usr/lib64/libtbb.so.2+0x301d215bb4)

SUMMARY: AddressSanitizer: 54 byte(s) leaked in 3 allocation(s).
make[3]: *** [CMakeFiles/check] Error 1
make[2]: *** [CMakeFiles/check.dir/all] Error 2
make[1]: *** [CMakeFiles/check.dir/rule] Error 2
make: *** [check] Error 2

Код компилируется с отключенными оптимизациями (-O0) и указателем -fno-omit-frame-pointer. Как я могу получить больше информации об утечке?


person Perennialista    schedule 05.10.2017    source источник
comment
Вы пробовали валгрид?   -  person gsamaras    schedule 05.10.2017
comment
Хороший вопрос @gsamaras. Я постараюсь посмотреть, вернет ли valgrind больше информации.   -  person Perennialista    schedule 05.10.2017


Ответы (1)


Утечка происходит в системной библиотеке, которая, предположительно, была скомпилирована без -fno-omit-frame-pointer, поэтому Асану не удается пройти через нее с помощью указателей фреймов. Вы можете попробовать использовать медленный, но более надежный разматыватель DWARF, установив

# Or LSAN_OPTIONS, if you use standalone LSan
export ASAN_OPTIONS=fast_unwind_on_malloc=0

См. здесь и здесь для получения дополнительной информации о флагах времени выполнения.

Кстати, вы можете попросить Lsan не прерывать работу при ошибке через

# Or LSAN_OPTIONS, if you use standalone LSan
export ASAN_OPTIONS=exitcode=0:...
person yugr    schedule 05.10.2017
comment
Я попытался отключить fast_unwind_on_malloc и получил больше информации, но все еще недостаточно, чтобы точно определить проблему, похоже, это также связано с pthread. Мне нужно будет изучить это подробнее, но спасибо за то, что дали мне направление и ответили на мой вопрос! - person Perennialista; 05.10.2017