valgrind обнаруживает утечки памяти при использовании libcurl (без ssl)

#c #memory-leaks #libcurl #valgrind

#c #утечки памяти #libcurl #valgrind

Вопрос:

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

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

 CURL *curl;
CURLcode res;

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

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

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

Что я могу сделать? Могу ли я заставить 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: ???
...
  

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

1. вы проверяете curl==0 ?

2. @fazo да, после вызова curl_easy_init у меня есть if(curl) { … } проверка на месте.

3. это паршивое место для отправки отчетов об ошибках в проекты с открытым исходным кодом…

4. @DanielStenberg верно, но это не сообщение об ошибке. Это скорее вопрос о том, что делать, когда valgrind выдает неожиданные ошибки с libcurl. Если вы можете сказать мне, как получить дополнительную информацию от valgrind и что ошибки являются законными, я отправлю отчет об ошибке 🙂

Ответ №1:

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

Ответ №2:

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

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

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

1. еще год спустя… Я обнаружил, что это очищает большую часть (93 КБ в моем исходном http-запросе), но оно было уменьшено до 64 БИТ. Стоит отметить, что функция не является потокобезопасной и вызывает другие не потокобезопасные библиотеки. Также стоит отметить, что утечка не увеличивается со временем после дополнительных запросов…

2. Я добавляю,, но он пока не очищается.

3. Вы освободили заголовки? попробуйте добавить curl_slist_free_all(headers); раньше curl_easy_cleanup(curl) , если у вас есть заголовки в списке

Ответ №3:

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

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

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

1. Нет, я не собирал libcurl из исходного кода, я установил его через свой менеджер пакетов. Если бы вы могли сказать мне, как заставить valgrind выводить файл / строку, в которой возникли ошибки, я, безусловно, могу указать полный вывод в своем вопросе. Но все ошибки, которые я получаю, выглядят так же, как та, которую я опубликовал.

Ответ №4:

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

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

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

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

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

Ответ №5:

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

Ответ №6:

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

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

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