valgrind обнаруживает утечки памяти при использовании libcurl (без ssl) - PullRequest
4 голосов
/ 23 октября 2011

В моей C-программе я использую некоторые основные функции libcurl.Сегодня я запустил valgrind, чтобы проверить, есть ли у меня утечки памяти, и valgrind сошел с ума, сообщив о множественных ошибках.

Я отследил его в основном до:

CURL *curl;
CURLcode res;

curl = curl_easy_init();
// ...
curl_easy_cleanup(curl);

Если я удалю код, который используетlibcurl полностью, valgrind не сообщает об ошибках.

Я уже читал, что есть некоторые проблемы с использованием valgrind с libcurl и ssl, но я не получаю никакие https URL-адреса или тому подобное.

Что я могу сделать?Могу ли я сделать так, чтобы valgrind заткнулся об ошибках libcurl (возможно, о ложных срабатываниях?) И сообщал только об ошибках из моего кода?Из-за огромного количества ошибок, несмотря на самое простое использование libcurl, вывод valgrind довольно запутанный.

К сожалению, у меня не установлена ​​отладочная версия libcurl, поэтому valgrind даже не сообщает номера строк / файлов, в которых он находитсяобнаружил утечки.Сообщения об ошибках выглядят так:

==27330== 
==27330== HEAP SUMMARY:
==27330==     in use at exit: 34,960 bytes in 2,406 blocks
==27330==   total heap usage: 20,130 allocs, 17,724 frees, 2,511,576 bytes allocated
==27330== 
==27330== 40 (20 direct, 20 indirect) bytes in 1 blocks are definitely lost in loss record 383 of 445
==27330==    at 0x4025BD3: malloc (vg_replace_malloc.c:236)
==27330==    by 0x4B173FD: ???
==27330==    by 0x4B17A8B: ???
==27330==    by 0x4B84957: ???
==27330==    by 0x4B849FD: ???
==27330==    by 0x4B72814: ???
==27330==    by 0x4B734C1: ???
==27330==    by 0x4B78DE2: ???
==27330==    by 0x4B7524B: ???
==27330==    by 0x49B2F76: ???
==27330==    by 0x49C9ECB: ???
==27330==    by 0x49BC96A: ???
...

Ответы [ 6 ]

6 голосов
/ 25 сентября 2012

Я знаю, что этот ответ придет через год, но кто-то может все еще найти его полезным.
После вызова на curl_easy_cleanup(curl), попробуйте добавить вызов на curl_global_cleanup().

Это сработало для меня.

5 голосов
/ 01 апреля 2014

Если вы начинаете с первого примера libcurl (simple.c), они не вызывают curl_global_init(long flags) и curl_global_cleanup() в конце, и valgrind будет сообщить о потенциальных проблемах. Как указано в документации по libcurl, вы ДОЛЖНЫ звонить ОБА curl_global_init и curl_global_cleanup. Я убедился, что это решает проблему; valgrind сообщит, что все блоки кучи были освобождены.

2 голосов
/ 23 октября 2011

libcurl не пропускает, но может использовать методы, которые будут тревожить valgrind.Итак, чтобы повторить из других ответов, какие ошибки сообщает valgrind?

Я не ожидаю, что у вас есть исходные коды libcurl, но, если вы это сделаете, куда вас укажут ошибки valgrind?

0 голосов
/ 24 октября 2011

Я спросил в списке рассылки, и никто не мог точно сказать мне, где моя проблема, так как я все еще уверен, что я установил отладочную версию новейшего выпуска libcurl, но все же я не мог видеть никаких символов отладки.

Так или иначе, я установил новую виртуальную машину и скомпилировал libcurl из исходного кода, и странные сообщения об ошибках исчезли.

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

0 голосов
/ 23 октября 2011

Скорее всего, valgrind просто ошибается относительно libcurl.Часто для таких библиотек он не видит правильно один конец выделения / освобождения и запутывается.Хороший дистрибутив ОС должен предоставить вам «подавляющие» файлы для этого, но, очевидно, ваш не сделал этого.Вы можете справиться с этим самостоятельно с помощью опций --suppressions и --gen-suppressions или даже поместить такие вещи в файл конфигурации.

0 голосов
/ 23 октября 2011

Какие ошибки вы на самом деле получаете?

И, что не менее важно, утечки - это статическая величина, или они со временем увеличиваются? Небольшая одноразовая статическая утечка гораздо менее важна, чем утечка с течением времени.

Также возможно, что это ложное срабатывание от Вальгринда; зависит от конкретных ошибок и где вы их видите.

...