Я пытаюсь исправить утечку памяти в очень большом проекте. Тесты подтвердили, что утечка памяти является серьезной проблемой, и я работаю над поиском их источника.Фильтрация мусора с выхода valgrind
Запуск проекта в очень простом корпусе, я получил 850 потенциальных утечек памяти. Все, кроме приблизительно 5 из них выглядят как:
==83597== 768 bytes in 3 blocks are possibly lost in loss record 743 of 864
==83597== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==83597== by 0x548EF93: myproject_malloc (mysourcefile.c:48)
==83597== by 0x4F13FD5: ??? (in /path/to/project/library-version.so)
==83597== by 0x1101: ???
==83597== by 0xF7: ???
==83597== by 0x64D4D87: ???
==83597== by 0xFFFFFFFFFFFFFFFD: ???
==83597== by 0x6: ???
==83597== by 0x4F03BB0: ??? (in /path/to/project/library-version.so)
==83597== by 0xFFFFFFFFFFFFFFFD: ???
==83597== by 0x64D4D87: ???
==83597== 920 bytes in 1 blocks are possibly lost in loss record 750 of 864
==83597== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==83597== by 0x548EF93: myproject_malloc (mysourcefile.c:48)
==83597== by 0x4F13FD5: ??? (in /path/to/project/library-version.so)
==83597== by 0xFFEFFFD5F: ???
==83597== by 0x38F: ???
==83597== by 0xFFEFFFE5F: ???
==83597== by 0xF: ???
==83597== by 0x54542FF: ??? (in /path/to/project/library-version.so)
==83597== by 0x4F536CA: ??? (in /path/to/project/library-version.so)
==83597== by 0x64B981F: ???
==83597== by 0xF: ???
==83597== by 0x54542FF: ??? (in /path/to/project/library-version.so)
==83597== 1,360 bytes in 1 blocks are possibly lost in loss record 789 of 864
==83597== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==83597== by 0x548EF93: myproject_malloc (mysourcefile.c:48)
==83597== by 0x4F13FD5: ??? (in /path/to/project/library-version.so)
==83597== by 0x1101: ???
==83597== by 0x547: ???
==83597== by 0x1F: ???
==83597== by 0x6584267: ???
==83597== by 0x547: ???
==83597== by 0x4F13808: ??? (in /path/to/project/library-version.so)
==83597== by 0x6584267: ???
==83597== by 0x6584527: ???
==83597== by 0x65805FF: ???
Я работаю над Valgrind, чтобы дать реальный, полезный выход, а не ???, но это не может быть возможно, и я хотел бы быть в состоянии чтобы получить полезный вывод из memcheck, пока это не произойдет.
В полезном отчете есть> 1 вызов функции из реального исходного файла, а не файла .so (поскольку каждый вывод сообщает myproject_malloc как потенциальный источник утечки). Какой самый простой способ я могу вырезать весь мусор из вывода и все еще отображать его как обычный текст в моем буфере компиляции emacs?
Я знаю, что я мог бы написать скрипт Python, который будет состоять из нескольких десятков строк для выполнения задания, каждый раз, когда я ввожу новый отчет об ошибке и подсчитываю количество раз, которое я вижу «.c: \ d +», но я бы предпочел что-то более простое.
Есть ли хороший способ сделать это с помощью средств командной строки? Или вариант, который я не знаю?
Я не хочу подавлять на основе источника, потому что есть трассировки стека, которые меня волнуют, которые проходят через проблемную библиотеку, и трассировки стека, которые начинаются там, но идут в код, который правильно отображает символы. AFAIK единственный способ сохранить всю информацию - это подавить на основе количества хороших символов на выходе, а не всего остального. Есть ли способ сделать это? –
Кроме того, я уже компилирую с '-g' (насколько я могу судить, может быть Makefile в некотором углу, который меня не слушает) - причина, по которой мне нужно это сделать, - это то, что я могу не получится. –
Я имел в виду строки с '/ path/to/project/library-version.so'. Если у них была отладочная информация, работоспособный файл подавления лучше мог бы ссылаться на номера строк в библиотеке и использовать подавление уровня кадра для элементов стека, у которых есть вопросительные знаки. –