admin管理员组

文章数量:1537955

写好个服务程序,短期测试没啥问题,准备跑长时间的。结果,前两天正常,第三天突然涨了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测试报告分析

本文标签: 内存UbuntuLinux