在 linux 平台中调试 cc++ 内存泄漏方法

在 linux 平台中调试 cc++ 内存泄漏方法

ID:19621142

大小:44.50 KB

页数:7页

时间:2018-10-04

在 linux 平台中调试 cc++ 内存泄漏方法_第1页
在 linux 平台中调试 cc++ 内存泄漏方法_第2页
在 linux 平台中调试 cc++ 内存泄漏方法_第3页
在 linux 平台中调试 cc++ 内存泄漏方法_第4页
在 linux 平台中调试 cc++ 内存泄漏方法_第5页
资源描述:

《在 linux 平台中调试 cc++ 内存泄漏方法》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、在Linux平台中调试C/C++内存泄漏方法收藏级别:初级韩兆兵(hanzb@cn.ibm.com),软件工程师,IBM刘盈(cdlliuy@cn.ibm.com),软件工程师,IBM强晟(qiangsh@cn.ibm.com),软件工程师,IBM2008年5月15日由于C和C++程序中完全由程序员自主申请和释放内存,稍不注意,就会在系统中导入内存错误。同时,内存错误往往非常严重,一般会带来诸如系统崩溃,内存耗尽这样严重的后果。本文将从静态分析和动态检测两个角度介绍在Linux环境进行内存泄漏检测

2、的方法,并重点介绍静态分析工具BEAM、动态监测工具Valgrind和rationalpurify的使用方法。相信通过本文的介绍,能给大家对处理其它产品或项目内存泄漏相关的问题时提供借鉴。由于C和C++程序中完全由程序员自主申请和释放内存,稍不注意,就会在系统中导入内存错误。同时,内存错误往往非常严重,一般会带来诸如系统崩溃,内存耗尽这样严重的后果。从历史上看,来自计算机应急响应小组和供应商的许多最严重的安全公告都是由简单的内存错误造成的。自从70年代末期以来,C/C++程序员就一直讨论此类错误,

3、但其影响在2007年仍然很大。与许多其他类型的常见错误不同,内存错误通常具有隐蔽性,即它们很难再现,症状通常不能在相应的源代码中找到。例如,无论何时何地发生内存泄漏,都可能表现为应用程序完全无法接受,同时内存泄漏不是显而易见[1]。存在内存错误的C和C++程序会导致各种问题。如果它们泄漏内存,则运行速度会逐渐变慢,并最终停止运行;如果覆盖内存,则会变得非常脆弱,很容易受到恶意用户的攻击。因此,出于这些原因,需要特别关注C和C++编程的内存问题,特别是内存泄漏。本文先从如何发现内存泄漏,然后是用不同

4、的方法和工具定位内存泄漏,最后对这些工具进行了比较,另外还简单介绍了资源泄漏的处理(以句柄泄漏为例)。本文使用的测试平台是:Linux(RedhatAS4)。但是这些方法和工具许多都不只是局限于C/C++语言以及linux操作系统。内存泄漏一般指的是堆内存的泄漏。堆内存是指程序从堆中分配的、大小任意的(内存块的大小可以在程序运行期决定)、使用完后必须显示的释放的内存。应用程序一般使用malloc、realloc、new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delet

5、e释放该内存块。否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。1.如何发现内存泄漏有些简单的内存泄漏问题可以从在代码的检查阶段确定。还有些泄漏比较严重的,即在很短的时间内导致程序或系统崩溃,或者系统报告没有足够内存,也比较容易发现。最困难的就是泄漏比较缓慢,需要观测几天、几周甚至几个月才能看到明显异常现象。那么如何在比较短的时间内检测出有没有潜在的内存泄漏问题呢?实际上不同的系统都带有内存监视工具,我们可以从监视工具收集一段时间内的堆栈内存信息,观测增长趋势,来确定是否有内存泄漏。在Li

6、nux平台可以用ps命令,来监视内存的使用,比如下面的命令(观测指定进程的VSZ值):ps-aux回页首2.静态分析包括手动检测和静态工具分析,这是代价最小的调试方法。2.1手动检测当使用C/C++进行开发时,采用良好的一致的编程规范是防止内存问题第一道也是最重要的措施。检测是编码标准的补充。二者各有裨益,但结合使用效果特别好。专业的C或C++专业人员甚至可以浏览不熟悉的源代码,并以极低的成本检测内存问题。通过少量的实践和适当的文本搜索,您能够快速验证平衡的*alloc()和free()或者new

7、和delete的源主体。人工查看此类内容通常会出现像清单1中一样的问题,可以定位出在函数LeakTest中的堆变量Logmsg没有释放。清单1.简单的内存泄漏#include#include#includeintLeakTest(char*Para){if(NULL==Para){//local_log("LeakTestFunc:emptyparameter");return-1;}char*Logmsg=newchar[128];i

8、f(NULL==Logmsg){//local_log("memeoryallocationfailed");return-2;}sprintf(Logmsg,"LeakTestroutineexit:'%s'.",Para);//local_log(Logmsg);return0;}intmain(intargc,char**argv){charszInit[]="testcase1";LeakTest(szInit);return0;}2.2静态代码分析工具代码静态扫描

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。