zzq191
驱动中牛
驱动中牛
  • 注册日期2001-08-09
  • 最后登录2018-05-29
  • 粉丝17
  • 关注0
  • 积分1041分
  • 威望716点
  • 贡献值0点
  • 好评度318点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:2272回复:13

在驱动程序里如何定位内存泄漏的地方

楼主#
更多 发布于:2007-06-12 16:01
在驱动程序里如何定位内存泄漏的地方?也就是用什么工具或方法可以快速定位什么地方分配的内存没有被释放过?
QQ:416331891,承接windows下应用和驱动的开发,雅虎通:zzq191, Email:zzq191@21cn.com
yunyanrong
驱动小牛
驱动小牛
  • 注册日期2003-04-18
  • 最后登录2013-03-02
  • 粉丝0
  • 关注0
  • 积分1040分
  • 威望457点
  • 贡献值1点
  • 好评度90点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-12-16 16:26
一个简单方式:

内存一初始化就全部申请好,以后只访问,驱动关闭时才删除。
nj6961
驱动牛犊
驱动牛犊
  • 注册日期2004-11-17
  • 最后登录2017-01-11
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望221点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于: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字节
最后不崩溃才怪!
呵呵
问题解决了
该睡觉觉咯。。。。。。。。。。。
driverdance
驱动牛犊
驱动牛犊
  • 注册日期2007-04-18
  • 最后登录2007-08-13
  • 粉丝0
  • 关注0
  • 积分640分
  • 威望65点
  • 贡献值0点
  • 好评度64点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-06-15 11:01
做个版本检查
承接WDM和hook的项目。
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-06-15 08:40
引用第9楼doskey于2007-06-14 18:50发表的  :


嗯。用这种方法肯定可以搞定,但是不方便定位到具体位置。用boundscheck比较好。
补充一下pool tag的意义在windbg安装文件夹下的triage下的pooltag.txt中有详细描述。


以前比较喜欢BoundsChecker,不管是app还是driver都喜欢用。但后来在一些机器上跑不起来,可能是Compuware太久不做更新了(现在连DS都不做了),兼容性有问题。后来就改用prefast了,现在的prefast已经做的很不错,比2年前的版本聪明多了,基本上发现的错误,有80%以上都是自己造成的。

现在WDK中的prefast的基本原理是基于各种annotation,根据这些keyword来判断代码中是否有错误。比如对于__in的参数,如果送过去的变量没有事先付值,就是一个错误;如果直接送个NULL过去,也是错误,只有__in_opt才可以送NULL。自己的各个函数,加上这些annotation keyword后,也可以让prefast检查到,省心好多
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
doskey
论坛版主
论坛版主
  • 注册日期2004-12-08
  • 最后登录2016-04-05
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望302点
  • 贡献值0点
  • 好评度300点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-06-14 16:50
引用第8楼rayyang2000于2007-06-14 10:00发表的  :
prefast + pooltag + DriverVerifier


嗯。用这种方法肯定可以搞定,但是不方便定位到具体位置。用boundscheck比较好。
补充一下pool tag的意义在windbg安装文件夹下的triage下的pooltag.txt中有详细描述。
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-06-14 10:00
prefast + pooltag + DriverVerifier
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
ProPlayboy
驱动大牛
驱动大牛
  • 注册日期2005-07-07
  • 最后登录2022-02-15
  • 粉丝0
  • 关注0
  • 积分1016分
  • 威望811点
  • 贡献值0点
  • 好评度719点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2007-06-14 01:59
DDK中有一个工具可以看内存标志的
人不靓仔心灵美,版头不正红花仔!
driverdance
驱动牛犊
驱动牛犊
  • 注册日期2007-04-18
  • 最后登录2007-08-13
  • 粉丝0
  • 关注0
  • 积分640分
  • 威望65点
  • 贡献值0点
  • 好评度64点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-06-13 13:09
1.boundschecker,不过我只在ring3用过这个工具,ring0应该也可以用
2.测试一下早期的版本
承接WDM和hook的项目。
zzq191
驱动中牛
驱动中牛
  • 注册日期2001-08-09
  • 最后登录2018-05-29
  • 粉丝17
  • 关注0
  • 积分1041分
  • 威望716点
  • 贡献值0点
  • 好评度318点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2007-06-13 13:00
我现在的问题是调用分配内存的函数分配非分页内存,结果分配失败,我在任务管理器中也看到未分页内存上涨后就没有下来,所以我怀疑是否有内存泄漏
QQ:416331891,承接windows下应用和驱动的开发,雅虎通:zzq191, Email:zzq191@21cn.com
driverdance
驱动牛犊
驱动牛犊
  • 注册日期2007-04-18
  • 最后登录2007-08-13
  • 粉丝0
  • 关注0
  • 积分640分
  • 威望65点
  • 贡献值0点
  • 好评度64点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2007-06-13 08:59
内存被耗尽是很罕见的。
承接WDM和hook的项目。
GoodOnline
驱动小牛
驱动小牛
  • 注册日期2007-04-11
  • 最后登录2009-02-28
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望204点
  • 贡献值0点
  • 好评度191点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2007-06-12 17:23
分配内存时候加个 tag
然后用 !poolfind 查
zzq191
驱动中牛
驱动中牛
  • 注册日期2001-08-09
  • 最后登录2018-05-29
  • 粉丝17
  • 关注0
  • 积分1041分
  • 威望716点
  • 贡献值0点
  • 好评度318点
  • 原创分0分
  • 专家分0分
  • 社区居民
12楼#
发布于:2007-06-12 16:43
我现在的问题是在驱动里分配非分页内存失败了,我想这个问题应该是内存泄漏导致非分页内存消耗太多了,从而分配不成功的吧
QQ:416331891,承接windows下应用和驱动的开发,雅虎通:zzq191, Email:zzq191@21cn.com
Kalee
驱动牛犊
驱动牛犊
  • 注册日期2002-10-26
  • 最后登录2012-02-21
  • 粉丝0
  • 关注0
  • 积分358分
  • 威望47点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2007-06-12 16:15
很麻烦,我做了引用计数,结果找了两天,发现是在根本没注意的另一个地方。
游客

返回顶部