Intereting Posts

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

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

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

CURL *curl; CURLcode res; curl = curl_easy_init(); // ... curl_easy_cleanup(curl); 

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

Я уже читал, что есть некоторые проблемы с использованием valgrind с libcurl и ssl, но я не беру никаких 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: ??? ... 

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

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

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

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

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

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

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

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

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

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

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

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