Недавно я обновил свою виртуальную машину для разработки 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). Может ли старое поведение быть как-то повторно включено? Или мне нужно изменить рабочий процесс и отсоединиться от программы, прежде чем убить ее, чтобы получить отчет об утечке?