C++技术问题总结-第15篇 内存泄露有哪些方法定位,崩溃有哪些方法定位

       Visual C++内存泄露检测,可采用VLD工具。
       VLD:Visual Leak Detector。VLD是一款用于Visual C++的免费的内存泄露检测工具。他的特点有:可以得到内存泄漏点的调用堆栈,如果可以的话,还可以得到其所在文件及行号;可以得到泄露内存的完整数据;可以设置内存泄露报告的级别;并且是开源免费的。
       官方网址:http://vld.codeplex.com/releases/view/82311
       使用步骤:
1)官网下载VLD工具包。
2)解压后得到vld.h, vldapi.h, vld.lib, vldmt.lib, vldmtdll.lib, dbghelp.dll等文件。
3)将.h文件和.lib文件拷贝到你要检测的工程文件所在的目录里(只针对此工程),将dbghelp.dll拷贝到你的程序的运行目录下。
4)在包含入口函数的.cpp文件中包含vld.h就可以了。
     
       linux的内存泄露,可以使用valgrind工具进行检测。
       Valgrind是运行在Linux上一套基于仿真技术的程序调试和分析工具,它包含一个内核──一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务──调试,分析,或测试等。Valgrind可以检测内存泄漏和内存违例。
       Valgrind中内存检测工具Memcheck ,用来检测程序中出现的内存问题,所有对内存的读写都会被检测到,一切对malloc()/free()/new/delete的调用都会被捕获。
       所以,它能检测以下问题: 
1)对未初始化内存的使用。
2)读/写释放后的内存块。
3)读/写超出malloc分配的内存块。
4)读/写不适当的栈中内存块。
5)内存泄漏,指向一块内存的指针永远丢失。
6)不正确的malloc/free或new/delete匹配。
7)memcpy()相关函数中的dst和src指针重叠。 
       这些问题往往是C/C++程序员最头疼的问题,Memcheck在这里帮上了大忙。 

       程序崩溃定位方法。
       参考文章:http://blog.csdn.net/frankiewang008/article/details/8021411
1)开发环境中崩溃。
       此时可以直接进入调试器定位出错位置,调试器中加载对应的PDB文件即可定位出错位置。
2)测试环境中崩溃。
       可采用远程调试技术来定位错误。Microsoft Visual Studio自带有远程调试工具Remote Debugger。
步骤。
a.发送Remote Debugger到待测试机器。
b.配置Remote Debugger支持远程调试。
c.开发机器打开Visual Studio,进行远程调试。Debug->Attach to Process。
       配置:Transport为Remote,Qualifier输入待远程机器IP。
3)用户环境中崩溃。
       这种环境下最为棘手。定位步骤如下。
a.开发过程中关键步骤添加打印日志,便于问题定位。
b.崩溃回调注册,拦截Windows程序崩溃。
       拦截Windows自带异常处理回调。
       对应API:SetUnhandledExceptionFilter。
c.在回调处理中,输出崩溃原因,崩溃内存地址,崩溃堆栈。
       崩溃信息在异常回调函数中打印,输出到程序执行目录下的文件
       异常处理回调的函数原形:
       LONG WINAPI CallBackDebugInfo ( EXCEPTION_POINTERS *pException); 
d.工程输出map文件。
       map文件记录程序的全局符号、源文件和代码行号信息,是整个程序工程信息的静态文本。通过文本阅读工具如Ultra Edit或记事本就可以打开Map文件。
       在 VC 中,打开“Project Settings”选项页,选择 C/C++ 选项卡,并在最下面的 Project Options 里面输入:/Zd ,然后选择 Link 选项卡,选中“Generate mapfile”复选框。并在最下面的 Project Options里面输入:/mapinfo:lines,表示生成 map 文件时,加入行信息。
       最后编译就可以生成 MAP 文件,可以在工程的Debug或Release目录下找到刚刚生成的MAP文件,文件名为“工程名.map”。
e.使用map文件找出崩溃函数。
       使用的关键信息为崩溃地址。map文件中包含各个函数的生成地址。
f.使用map代码行定位崩溃行区间。
       map文件中包含代码行的生成地址,可进行行定位。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。