LeakSanitizer не работает под GDB в Ubuntu 18.04?

Вопрос задан: 1 год назад Последняя активность: 1 год назад
up 3 down

Я недавно обновил свою виртуальную машину для разработки 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 ([email protected]=6) at ../sysdeps/unix/sysv/linux/raise.c:51

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

1 ответ

Возможно, для Вашего проекта будут необходимы бесплатные векторные карты. На нашем сайте представлены карты для всех стран.

Реклама

up 0 down

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.

Ошибка 505

Что-то пошло не так

Попробуйте воспользоваться поиском