LeakSanitizer не работает под GDB в Ubuntu 18.04? - PullRequest
0 голосов
/ 03 января 2019

Недавно я обновил свою виртуальную машину для разработки Linux с Ubuntu 16.04 до 18.04 и заметил одну вещь, которая изменилась. Это на x86-64. С 16.04 у меня всегда был этот рабочий процесс, где я собирал проект, над которым я работаю, с помощью gcc (5.4, стандартная версия в 16.04) и -fsanitize=address и -O0 -g, а затем запускал исполняемый файл через gdb ( 7.11.1, также версия, которая пришла с Ubuntu). Это работало нормально, и в конце LeakSanitizer выдаст отчет об утечке, если обнаружит утечки памяти.

В 18.04 это, похоже, больше не работает; LeakSanitizer жалуется на запуск под ptrace:

==5820==LeakSanitizer has encountered a fatal error.
==5820==HINT: For debugging, try setting environment variable LSAN_OPTIONS=verbosity=1:log_threads=1
==5820==HINT: LeakSanitizer does not work under ptrace (strace, gdb, etc)

Затем программа вылетает:

Thread 1 "spyglass" received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51

Я не уверен, что вызывает новое поведение. 18 апреля я собираюсь с gcc shipped (7.3.0) по умолчанию, использую -fsanitize=address -O0 -g и отлаживаю с gdb по умолчанию (8.1.0). Может ли старое поведение быть как-то повторно включено? Или мне нужно изменить рабочий процесс и отсоединиться от программы, прежде чем убить ее, чтобы получить отчет об утечке?

1 Ответ

0 голосов
/ 26 января 2019

LeakSanitizer внутренне использует ptrace, возможно, для приостановки всех потоков, чтобы он мог сканировать на наличие утечек без ложных срабатываний (см. выпуск 9 ).Только одно приложение может использовать ptrace, поэтому, если вы запускаете ваше приложение в gdb или strace, LeakSanitizer не сможет подключиться через ptrace.

Если вы не заинтересованы в отладке утечек, отключите ее:

export ASAN_OPTIONS=detect_leaks=0

Если вы хотите включить отладку по утечкам, вы должны отключить отладчик до того, как LeakSanitizer начнет сканирование.Чтобы иметь возможность подключить отладчик вскоре после этого, немного поспим (например, 10 секунд):

export ASAN_OPTIONS=sleep_before_dying=10
./program

Затем в другой оболочке снова подключите к приложению:

gdb -q -p $(pidof program)

Для более подробного описания вышеуказанных (и других) опций см. https://github.com/google/sanitizers/wiki/AddressSanitizerFlags.

...