写好个服务程序,短期测试没啥问题,准备跑长时间的。结果,前两天正常,第三天突然涨了100多M…
这感觉,爽飞了。
这里说下Ubuntu中内存泄露检测工具:Valgrind。安装和使用连接如下:
链接: Valgrind安装使用
这里大概说下统计结果类型:
=1018910== LEAK SUMMARY:(泄漏总结)
==1018910== definitely lost (确定的内存泄露): 30,680 bytes in 10 blocks
==1018910== indirectly lost (间接的内存泄露): 208,385 bytes in 235 blocks
==1018910== possibly lost(可能的内存泄露) : 11,022 bytes in 24 blocks
==1018910== still reachable (内存指针还在使用的,未丢失但也未释放): 273,541 bytes in 3,727 blocks
==1018910== suppressed:(已被解决) 0 bytes in 0 blocks
这里直接展示下本地报的definitely 问题:
==1018910==
==1018910== 238,265 (30,120 direct, 208,145 indirect) bytes in 5 blocks are definitely lost in loss record 594 of 594
==1018910== at 0x483DD99: calloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==1018910== by 0x49CC68D: ??? (in /usr/lib/x86_64-linux-gnu/libcurl.so.4.6.0)
==1018910== by 0x49D8D07: curl_easy_init (in /usr/lib/x86_64-linux-gnu/libcurl.so.4.6.0)
==1018910== by 0x123EC5: libcurl_posts(char const*, curl_slist*, char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&) (libcurl.h:282)
==1018910== by 0x1248BA: CAPIObj::httpPost(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >) (APIObj.cpp:128)
==1018910== by 0x116310: CDevDriver::CoreRun() (CDevDriver.cpp:402)
==1018910== by 0x115273: CDevDriver::DriverThreadProc(void*) (CDevDriver.cpp:243)
==1018910== by 0x4875608: start_thread (pthread_create.c:477)
==1018910== by 0x4D58292: clone (clone.S:95)
定位到了 curl_easy_init,对应源代码如下:
CURL *conn = NULL;
CURLcode code;
curl_global_init(CURL_GLOBAL_DEFAULT);
conn = curl_easy_init();
if (NULL == conn)
{
std::cout << stderr << " Failed to create CURL connection" << std::endl;
exit(EXIT_FAILURE);
}
code = curl_easy_setopt(conn, CURLOPT_ERRORBUFFER, error_buffer);
if (code != CURLE_OK)
{
std::cout << stderr << " Failed to set error buffer " << code << std::endl;
return false;
}
code = curl_easy_setopt(conn,CURLOPT_FOLLOWLOCATION, 1L);
if (code != CURLE_OK)
{
std::cout << stderr << " Failed to set error buffer " << code << std::endl;
return false;
}
code = curl_easy_setopt(conn, CURLOPT_CUSTOMREQUEST, "POST");
if (code != CURLE_OK)
{
std::cout << stderr << " Failed to set error buffer " << code << std::endl;
return false;
}
这里是调用的libcurl 做的HTTP的post初始化,大家有注意到问题在哪里吗…
挺无语的问题,下面的return没有释放conn直接反回了,之前在utf8转gbk那边也是这个问题。望大家引以为戒。
具体的解析分析: valgrind测试报告分析