valgrind не удалось найти утечку памяти

#c #memory-leaks #valgrind

#c #утечки памяти #вальгринд

Вопрос:

Я столкнулся со странной проблемой. Процесс(написанный на c) вызывает утечку памяти, но я не могу определить, почему это происходит. Использование памяти постоянно увеличивается, когда процесс обрабатывает трафик, и в какой-то момент ОС(linux) убивает его с ошибкой «не хватает памяти».

Я попытался отладить это с помощью valgrind со следующими флагами:

 --show-reachable=yes --leak-check=full --show-leak-kinds=all --track-origins=yes --verbose --track-fds=yes --num-callers=20 --log-file=/tmp/valgrind-out.txt  

Выходной файл выглядит следующим образом:

 ==5564== LEAK SUMMARY: ==5564== definitely lost: 0 bytes in 0 blocks ==5564== indirectly lost: 0 bytes in 0 blocks ==5564== possibly lost: 646,916 bytes in 1,156 blocks ==5564== still reachable: 4,742,112 bytes in 2,191 blocks ==5564== suppressed: 0 bytes in 0 blocks  

Определенно потерянный отображается как 0, и нет никаких указаний на то, где он протекает. Я прошел все еще доступный сегмент, все они кажутся прекрасными. Я не смогу опубликовать код, так как это огромный код с более чем 100 тысячами строк. В основном то, что он делает, он отправляет некоторые пакеты через tcp-сокет в качестве клиента. Sever-это простой скрипт на python, который отвечает ответом. Мои коды работают так, как и ожидалось. Эта утечка-единственная проблема.

Есть какие-нибудь предложения по отладке этой проблемы?

Комментарии:

1. Увеличение использования памяти автоматически не указывает на утечку памяти.

2. @EugeneSh. Верно, но использование памяти непрерывно увеличивается с каждым потоком запросов/ответов. Это вызывает беспокойство.

3. Поскольку длина программы составляет более 100 тысяч строк, это не так просто, как вы описываете. Может быть, это добавление некоторых данных в какую-то структуру данных с каждым запросом, например? Действительно трудно сказать, как подойти к нему, не видя кода, так как «универсальные» инструменты, такие как Valgrind, как вы видите, не помогают.

4. Вполне возможно, что «реальной» утечки нет, и программа способна правильно все очистить при выходе, поэтому вы ничего не видите в сводке. Используете ли вы пользовательские пулы/распределители памяти? Valgrind не обязательно будет обнаруживать утечки памяти в пользовательском пуле, но пул может освободить все при выходе.

5. Нам нужно увидеть соответствующий код. То есть код, который это делает malloc/free .Пожалуйста, отредактируйте свой вопрос и разместите его в блоке кода здесь. Проверка на рабочем столе: Для каждого распределения, где блок освобождается? Другой способ: напишите функции-оболочки, которые перехватывают/регистрируют все эти вызовы. Если вы можете скомпилировать, вы можете сделать (например) #define malloc(_siz) logging_malloc(_siz) Иначе, с glibc помощью , вы можете использовать функции «зацепления» (например): __malloc_hook . Смотрите страницы man3 для mcheck , mtrace , mallopt , malloc_info