在我的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: ???
...
答案 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_init
和curl_global_cleanup
。我证实了自己解决了这个问题; valgrind将报告已释放所有堆块。
答案 2 :(得分:2)
libcurl不会泄漏,但可能使用会警告valgrind的技术。那么,从其他答案重复一遍,valgrind报告的错误是什么?
我不指望你有libcurl源,但是,如果你这样做,valgrind错误指向你的位置?
答案 3 :(得分:0)
你真正得到了什么错误?
同样重要的是 - 泄漏是静态的,还是随着时间的推移而增长?随着时间的推移,小的一次性静态泄漏远不如泄漏那么重要。
这也可能是Valgrind的误报;取决于具体的错误以及您看到的位置。
答案 4 :(得分:0)
很可能valgrind在libcurl
方面遇到了错误。通常对于这样的库,它没有正确地看到分配/解除分配的一端并且混淆。一个好的操作系统发行版应该为你提供“抑制”文件,但很明显你的文件并没有这样做。您可以使用选项--suppressions
和--gen-suppressions
自行处理,甚至可以将这些内容放在配置文件中。
答案 5 :(得分:0)
我在邮件列表上询问,没有人可以确切地告诉我我的问题在哪里,因为我仍然确定我安装了最新的libcurl版本的调试版本,但我仍然看不到任何调试符号。
无论如何,我设置了一个新的虚拟机,并从源代码编译了libcurl,奇怪的错误信息消失了。
遗憾的是,我没有找到任何更有用的东西,虽然这可能帮助其他人解决同样的问题......