阅读:2271回复:13
在驱动程序里如何定位内存泄漏的地方
在驱动程序里如何定位内存泄漏的地方?也就是用什么工具或方法可以快速定位什么地方分配的内存没有被释放过?
|
|
|
沙发#
发布于:2007-06-12 16:15
很麻烦,我做了引用计数,结果找了两天,发现是在根本没注意的另一个地方。
|
|
板凳#
发布于:2007-06-12 16:43
我现在的问题是在驱动里分配非分页内存失败了,我想这个问题应该是内存泄漏导致非分页内存消耗太多了,从而分配不成功的吧
|
|
|
地板#
发布于:2007-06-12 17:23
分配内存时候加个 tag
然后用 !poolfind 查 |
|
地下室#
发布于:2007-06-13 08:59
内存被耗尽是很罕见的。
|
|
|
5楼#
发布于:2007-06-13 13:00
我现在的问题是调用分配内存的函数分配非分页内存,结果分配失败,我在任务管理器中也看到未分页内存上涨后就没有下来,所以我怀疑是否有内存泄漏
|
|
|
6楼#
发布于:2007-06-13 13:09
1.boundschecker,不过我只在ring3用过这个工具,ring0应该也可以用
2.测试一下早期的版本 |
|
|
7楼#
发布于:2007-06-14 01:59
DDK中有一个工具可以看内存标志的
|
|
|
8楼#
发布于:2007-06-14 10:00
prefast + pooltag + DriverVerifier
|
|
|
9楼#
发布于:2007-06-14 16:50
引用第8楼rayyang2000于2007-06-14 10:00发表的 : 嗯。用这种方法肯定可以搞定,但是不方便定位到具体位置。用boundscheck比较好。 补充一下pool tag的意义在windbg安装文件夹下的triage下的pooltag.txt中有详细描述。 |
|
10楼#
发布于:2007-06-15 08:40
引用第9楼doskey于2007-06-14 18:50发表的 : 以前比较喜欢BoundsChecker,不管是app还是driver都喜欢用。但后来在一些机器上跑不起来,可能是Compuware太久不做更新了(现在连DS都不做了),兼容性有问题。后来就改用prefast了,现在的prefast已经做的很不错,比2年前的版本聪明多了,基本上发现的错误,有80%以上都是自己造成的。 现在WDK中的prefast的基本原理是基于各种annotation,根据这些keyword来判断代码中是否有错误。比如对于__in的参数,如果送过去的变量没有事先付值,就是一个错误;如果直接送个NULL过去,也是错误,只有__in_opt才可以送NULL。自己的各个函数,加上这些annotation keyword后,也可以让prefast检查到,省心好多 |
|
|
11楼#
发布于:2007-06-15 11:01
做个版本检查
|
|
|
12楼#
发布于:2007-12-04 01:36
小可偶尔写写驱动
今天一个USB驱动中非分页内存泄漏 感谢楼上的各位大虾些 看了你们的帖子,才晓得去用最简单的 pooltag 然后对驱动程序采用2分法查找错误 最后找到了 PURB purb=NULL; i=100; while(i>0) { purb=mEpoint2in.BulidBuilkTransfer(......); ........................ .................. i--; } if(purb!=NULL) { delete purb; } 上述程序初看似乎没有错误 于是就不停的内存溢出 蓝屏 死机 最后 终于 实在受不了了 才来这里找帖子 拿着poolmon回去慢慢试 发现内核模式内存溢出居然在 purb=mEpoint2in.BulidBuilkTransfer(......); 狂晕一阵后才想到 这个BulidBuilkTransfer应该和NEW的作用类似 如此New了10次,只delete一次 运行久了 每次128字节 最后不崩溃才怪! 呵呵 问题解决了 该睡觉觉咯。。。。。。。。。。。 |
|
13楼#
发布于:2007-12-16 16:26
一个简单方式:
内存一初始化就全部申请好,以后只访问,驱动关闭时才删除。 |
|