您的位置:首页 > 编程语言 > C语言/C++

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

2014-12-15 14:19 1031 查看
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在这里帮上了大忙。

程序崩溃定位方法。

参考文章:/article/7653847.html

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文件中包含代码行的生成地址,可进行行定位。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: