#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 из исходного кода, и странные сообщения об ошибках исчезли.
Жаль, что я не нашел ничего более полезного, хотя это могло бы помочь другим с той же проблемой…