在 Linux下调试内存泄漏的方法

发表于:2011-6-02 10:34

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

分享:

  (2) Rational purify

  Rational Purify 主要针对软件开发过程中难于发现的内存错误、运行时错误。在软件开发过程中自动地发现错误,准确地定位错误,提供完备的错误信息,从而减少了调试时间。同时也是市场上唯一支持多种平台的类似工具,并且可以和很多主流开发工具集成。Purify 可以检查应用的每一个模块,甚至可以查出复杂的多线程或进程应用中的错误。另外不仅可以检查 C/C++,还可以对 Java 或 .NET 中的内存泄漏问题给出报告。

  在 Linux 系统中,使用 Purify 需要重新编译程序。通常的做法是修改 Makefile 中的编译器变量。下面是用来编译本文中程序的 Makefile:

  CC=purify gcc

  首先运行 Purify 安装目录下的 purifyplus_setup.sh 来设置环境变量,然后运行 make 重新编译程序。

  ./purifyplus_setup.sh

  下面给出编译一个代码文件的示例,源代码文件命名为 test3.cpp. 用 purify 和 g++ 的编译命令如下,‘-g’是编译时加上调试信息。

  purify g++ -g test3.cpp –o test

  运行编译生成的可执行文件 test,就可以得到图1,可以定位出内存泄漏的具体位置。

  ./test

  清单3. Purify 分析的代码

#include   
char * Logmsg;  
int LeakTest(char * Para)  
{  
if(NULL==Para){  
//local_log("LeakTest Func: empty parameter\n");  
return -1;  
}  
Logmsg = new char[128];  
for (int i = 0 ; i < 128; i++)  
Logmsg[i] = i%64;  
if(NULL == Logmsg){  
//local_log("memeory allocation failed\n");  
return -2;  
}  
sprintf(Logmsg,"LeakTest routine exit: '%s'.\n", Para);  
//local_log(Logmsg);  
return 0;  
}  
int main(int argc,char **argv )  
{  
char szInit [] = "testcase1";  
int i;  
LeakTest(szInit);  
for (i=0; i < 2; i++){  
if(i%200 == 0)  
LeakTest(szInit);  
sleep(1);  
}  
return 0;  
}

  需要指出的是,程序必须编译成调试版本才可以定位到具体哪行代码发生了内存泄漏。即在 gcc 或者 g++ 中,必须使用 "-g" 选项。

图 1 purify 的输出结果

  以上就是几种内存泄露,以及调试方法。对程序内存泄露的问题有着一定的帮助。

44/4<1234
重磅发布,2022软件测试行业现状调查报告~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2023
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号