valgrind在使用libcurl时检测到内存泄漏(没有ssl)

时间:2011-10-23 14:37:56

标签: c memory-leaks libcurl valgrind

在我的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: ???
...

6 个答案:

答案 0 :(得分:6)

我知道这个答案将在一年后出现,但有人可能仍然觉得它很有用 致电curl_easy_cleanup(curl)后,尝试添加对curl_global_cleanup()的通话。

这对我有用。

答案 1 :(得分:5)

如果您从第一个libcurl示例(simple.c)开始,他们最后不会调用curl_global_init(long flags)curl_global_cleanup(),而valgrind会报告潜在的问题。如libcurl文档中所述,您必须同时调用curl_global_initcurl_global_cleanup。我证实了自己解决了这个问题; valgrind将报告已释放所有堆块。

答案 2 :(得分:2)

libcurl不会泄漏,但可能使用会警告valgrind的技术。那么,从其他答案重复一遍,valgrind报告的错误是什么?

我不指望你有libcurl源,但是,如果你这样做,valgrind错误指向你的位置?

答案 3 :(得分:0)

你真正得到了什么错误?

同样重要的是 - 泄漏是静态的,还是随着时间的推移而增长?随着时间的推移,小的一次性静态泄漏远不如泄漏那么重要。

这也可能是Valgrind的误报;取决于具体的错误以及您看到的位置。

答案 4 :(得分:0)

很可能valgrind在libcurl方面遇到了错误。通常对于这样的库,它没有正确地看到分配/解除分配的一端并且混淆。一个好的操作系统发行版应该为你提供“抑制”文件,但很明显你的文件并没有这样做。您可以使用选项--suppressions--gen-suppressions自行处理,甚至可以将这些内容放在配置文件中。

答案 5 :(得分:0)

我在邮件列表上询问,没有人可以确切地告诉我我的问题在哪里,因为我仍然确定我安装了最新的libcurl版本的调试版本,但我仍然看不到任何调试符号。

无论如何,我设置了一个新的虚拟机,并从源代码编译了libcurl,奇怪的错误信息消失了。

遗憾的是,我没有找到任何更有用的东西,虽然这可能帮助其他人解决同样的问题......