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文件中包含代码行的生成地址,可进行行定位。

时间: 2024-08-28 09:01:32

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

内存泄露从入门到精通三部曲之排查方法篇

内存泄露从入门到精通三部曲之排查方法篇 最原始的内存泄露测试 重复多次操作关键的可疑的路径,从内存监控工具中观察内存曲线,是否存在不断上升的趋势且不会在程序返回时明显回落.这种方式可以发现最基本,也是最明显的内存泄露问题,对用户价值最大,操作难度小,性价比极高. MAT内存分析工具 2.1 MAT分析heap的总内存占用大小来初步判断是否存在泄露 在Devices 中,点击要监控的程序. 点击Devices视图界面中最上方一排图标中的“Update Heap” 点击Heap视图 点击Heap视图

使用gc、objgraph干掉python内存泄露与循环引用!

Python使用引用计数和垃圾回收来做内存管理,前面也写过一遍文章<Python内存优化>,介绍了在python中,如何profile内存使用情况,并做出相应的优化.本文介绍两个更致命的问题:内存泄露与循环引用.内存泄露是让所有程序员都闻风丧胆的问题,轻则导致程序运行速度减慢,重则导致程序崩溃:而循环引用是使用了引用计数的数据结构.编程语言都需要解决的问题.本文揭晓这两个问题在python语言中是如何存在的,然后试图利用gc模块和objgraph来解决这两个问题. 注意:本文的目标是Cpyth

java内存泄露详解

很多人有疑问,java有很好的垃圾回收机制,怎么会有内存泄露?其实是有的,那么何为内存泄露?在Java中所谓内存泄露就是指在程序运行的过程中产生了一些对象,当不需要这些对象时,他们却没有被垃圾回收掉,而且程序运行中很难发现这个对象,它始终占据着内存却没有发挥作用. 我举这样一个例子,在现实开发中我们需要自定义一个先进后出的栈集合,代码如下: 这个代码看起来和运行起来都没问题,但是,这里有个很隐晦的问题,就是在pop()方法里面,我们首先找到集合最后一个元素的下标,然后按照下标从集合中取出,但是这

vs下C++内存泄露检测

参考文章: http://msdn.microsoft.com/zh-cn/library/x98tx3cf.aspx http://www.cnblogs.com/jianqiang2010/archive/2010/12/02/1894327.html http://www.cnblogs.com/skynet/archive/2011/02/20/1959162.html 1.在main方法所在的文件里加上如下代码: 1 //可以定位到发生内存泄露 所在的文件和具体那一行,用于检测 mal

如何解决内存泄露:笨方法手动调试

上篇文章介绍了内存泄露以及避免方法,本篇文章介绍当内存泄露发生时,如何解决 1. 笨方法手动调试 1 检查代码是否每一个new.malloc 都有对应的 delete.free 2 观察有哪些可能分配内存和释放内存的代码,在其上下添加断点,以debug模式运行 3 打开任务管理器,查看调试程序的内存占用, 4 逐个排除: - 看运行哪些语句时内存占用增加 - 看运行释放内存语句后,内存占用是否减少 - 查看释放后的内存是否仍然存在 5 针对第4步找出内存释放失败的语句,通过查看内存的详细信息,逐

最新版 使用Xcode6.4 和Instruments、Leaks调试解决iOS内存泄露

分析内存泄露 最近用到内存泄露,查看以前的博客,方法不错,但操作时,步骤好多都找不到啦,不知道怎么操作.所以下面做了一个简单的例子 实验的开发环境:XCode 6.4 一.Analyze (shift+command+b) app不crash了,那看看有没有内存泄露.用XCode的Analyze就能分析到哪里有内存泄露 分析之后可以看到: 这里提示alertView没被释放,有内存泄露,那我们释放 [alertView release]; 再分析,这个问题解决了. 二.使用Instruments

Linux 内存泄露小结

本文仅限记录自己的一次 内存泄露追踪小记. 可能并不十分适用与大家的情况.而且方法也并不是很smart.仅做记录,能提供个思路更好.  一. 要问调试程序遇到什么问题最头疼, 内存泄露肯定能排在前几名里的.  内存泄露一般是由于 在申请.释放内存的过程中,并没有将其正确的结对使用. 出现了申请了内存,但是未释放或者少释放了内存的情况.   内存泄露问题的出现,可能短时间内不会造成很大的影响.但是如果长时间运行程序, 内存会被逐步蚕食殆尽. 而造成服务器(主机)工作异常的情况,严重的造成其他程序没

listView优化以及内存泄露问题

最经开发app使出现了由于ListView产生的内存泄露问题.我们知道内存泄露时很不好的.意味着,代码写的有点失败,需要做些优化改动. 经过这次的教训,以及在网上找了些资料,总结了一下,关于ListView的优化: listview优化问题: 首先,listview必须严格按照convertView及viewHolder格式书写,这样可以基本保证数据最优. 其次,如果自定义Item中有涉及到图片等等的,一定要做图片优化.bitmap释放可以不做. 第三,尽量避免在BaseAdapter中使用st

内存泄露与内存访问越界

内存泄露 在堆上分配的内存,没有及时释放掉,以便后面其它地方可以重用.在C/C++中,内存管理器不会帮你自动回收不再使用的内存.如果你忘了释放不再使用的内存,这些内存就不能被重用,就造成了所谓的内存泄露. 一两处内存泄露通常不至于让程序崩溃,也不会出现逻辑上的错误,当然了,量变会产生质变,一旦内存泄露过多以致于耗尽内存,后续内存分配将会失败,程序可能因此而崩溃. 内存访问越界,使用的内存 超出了 向系统申请了一块内存,覆盖该空间之后的一段存储区域,导致系统异常. 常见原因: 1 写越界,又叫缓冲