文档详情

C++_程序程序调试方法.ppt

发布:2018-04-27约8.89千字共81页下载文档
文本预览下载声明
-培训课程 内部公开- 华生医生日志分析 设置好符号文件的路径以后,我们用“WinDbg”加载故障转储文件,直接将文件拖动到“WinDbg” 窗口即可。 -培训课程 内部公开- 华生医生日志分析 我们在命令输入区输入!analyze –v,回车执行。 -培训课程 内部公开- 华生医生日志分析 我们可以看到,故障点已经准确定位。 -培训课程 内部公开- 华生医生日志分析 使用演示 -培训课程 内部公开- 第四章 内存泄露分析 -培训课程 内部公开- 内存泄露分析 内存泄漏(memory leak)指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏与许多其他问题有着相似的症状,并且通常情况下只能由那些可以获得程序源代码的程序员才可以分析出来。然而,有不少人习惯于把任何不需要的内存使用的增加描述为内存泄漏,严格意义上来说这是不准确的。  一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显式释放的内存。应用程序一般使用malloc,calloc,realloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。 什么是内存泄露? -培训课程 内部公开- 内存泄露分析 1、直接用VC++ IED定位简单的内存泄露。 2、借助第三方工具,常用的有Purify、 BoundsChecker、 LeakDiag,我们推荐使用Purify。 3、如果以上方法都不能定位,你们我们只能人工分析,通常的做法是将操作分解,看到底哪步 操作引起的。 什么是内存怎么定位 -培训课程 内部公开- 内存泄露分析 当我们在用VC++ IDE调试程序时,程序退出,你在VC++ IDE的“Debug”区看到如下信息,那么程序必然纯在内存泄露。 用VC++ IDE 定位内存泄露 -培训课程 内部公开- 内存泄露分析 如果泄露是因为你的代码引起的,直接双击输出的信息,就能定位到泄露的代码行上。 但是该方法只能定位简单的内存泄露,比较复杂的内存泄露是无法定位的,例如以下代码。 -培训课程 内部公开- 内存泄露分析 使用演示 -培训课程 内部公开- 内存泄露分析 我们用Purify检查内存泄露是,需要先点击下图中红圈标示的按钮,启动Purify监视。 借助Purify定位内存泄露 -培训课程 内部公开- 内存泄露分析 将程序调试运行起来,点击下图中红圈的按钮检测内存泄露。 借助Purify定位内存泄露 -培训课程 内部公开- 内存泄露分析 下图中我们可以看出Purify可以清楚的定位内存泄露的位置。 借助Purify定位内存泄露 -培训课程 内部公开- 内存泄露分析 使用演示 -培训课程 内部公开- 第五章 PageHeap使用 -培训课程 内部公开- Pageheap使用 Pageheap是一个让操作系统为我们对内存越界进行检测的配置工具,使用该工具可以设置操作系统为指定程序开启内存越界检测功能,但是我们不推荐随时都开启内存越界检测,因为那样会严重影响程序运行的效率。 Pageheap的使用方法如下在命令行输入: Pageheap /enable 程序名 0x01 为程序开启内存向后越界检测 Pageheap /enable 程序名 0x10 为程序开启内存向前越界检测 Pageheap /disable 程序名 关闭程序的内存越界检测 Pageheap 查看当前开启了内存越界检测的程序 -培训课程 内部公开- Pageheap使用 Pageheap能处理的错误类型: -培训课程 内部公开- Pageheap使用 以下代码,使用了已经释放的内存,在没有开启Pageheap时,程序不会出错。 char* pTestBuf = new char[20]; delete pTestBuf; pTestBuf[0] = 0; 开启Pageheap以后程序运行错误, 需要注意的是Pageheap也存在其 局限性,不可能检查出所有的内存 错误,良好的编码规范才是解决问
显示全部
相似文档