2015-12-17 2 views
2

Я пытаюсь исправить утечку памяти в очень большом проекте. Тесты подтвердили, что утечка памяти является серьезной проблемой, и я работаю над поиском их источника.Фильтрация мусора с выхода 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 +», но я бы предпочел что-то более простое.

Есть ли хороший способ сделать это с помощью средств командной строки? Или вариант, который я не знаю?

ответ

0

Как я сказал в комментариях, подавление основанного на происхождении не является подходящей методикой здесь из-за странных свойств библиотеки, с которой я работаю (почти каждая трассировка стека проходит через «плохую» библиотеку library-version.so и компилируется с -g не исправляет). Я в конечном итоге просто написать питон скрипт, который я буду размещать здесь для будущих пользователей:

#!/usr/bin/python 

import fileinput 
import re 

START = re.compile("in loss record") 
STOP = re.compile("^==\d+== $") 
GOOD = re.compile(r"\.c:\d+", re.M) 

def main(): 
    in_line = False 
    current = [] 
    for line in fileinput.input(): 
    if in_line: 
     in_line = not STOP.search(line) 
    else: 
     in_line = START.search(line) 

    if in_line: 
     current.append(line) 
    else: 
     match = GOOD.findall("".join(current)) 
     if len(match) > 2: 
     print "".join(current) 
     current = [] 

if __name__ == "__main__": 
    main() 

Теперь вы можете сохранить вывод VALGRIND в файл или трубу его непосредственно к этому сценарию, и это сокращает хлам. Настройте линию len(match) > FOO, чтобы контролировать, сколько результатов вы сохраняете.

2

Не является вариант, но конфигурации особенности: Valgrind может быть сконфигурирован с подавления файлами, которые говорят его игнорировать определенные следы стека.

Для получения дополнительной информации,

Да! Используйте функцию --gen-suppressions=yes, чтобы автоматически выплевывать подавления. Затем вы можете отредактировать их, если хотите, например. комбинируя подобные автоматически генерируемые подавления с использованием подстановочных знаков, таких как '*'.

Если вы действительно хотите написать подавления вручную, внимательно прочитайте руководство. Обратите внимание, что имена функций C++ должны быть искалечены (то есть не деманлированы).

Valgrind опирается на символы. Эти ??? предназначены для пропущенных символов (и некоторые из них не отображают вероятных адресов). Как я помню, valgrind поставляет те после проверки символов, поэтому (даже если для подходящего шаблона для ? в качестве метасимвола есть соответствующий символ), вы не можете явно их подавить.

В вашем стеке не хватает номеров строк для библиотеки проектов. Если вы компилируете с отладкой (-g) и создаете подходящее подавление уровня кадра, это, по-видимому, является улучшением.

+0

Я не хочу подавлять на основе источника, потому что есть трассировки стека, которые меня волнуют, которые проходят через проблемную библиотеку, и трассировки стека, которые начинаются там, но идут в код, который правильно отображает символы. AFAIK единственный способ сохранить всю информацию - это подавить на основе количества хороших символов на выходе, а не всего остального. Есть ли способ сделать это? –

+0

Кроме того, я уже компилирую с '-g' (насколько я могу судить, может быть Makefile в некотором углу, который меня не слушает) - причина, по которой мне нужно это сделать, - это то, что я могу не получится. –

+0

Я имел в виду строки с '/ path/to/project/library-version.so'. Если у них была отладочная информация, работоспособный файл подавления лучше мог бы ссылаться на номера строк в библиотеке и использовать подавление уровня кадра для элементов стека, у которых есть вопросительные знаки. –

Смежные вопросы