您的位置:首页 > 其它

错误调用CreateToolhelp32Snapshot导致内核内存泄露

2010-12-10 12:47 295 查看
前段时间写了一个驱动层程序,做好了驱动层,写了与其交互的用户层,结果运行时发现内存泄露严重,运行一段时间后,windows开始提示虚拟内存过低,观察任务管理器当中的PF值,发现它在疯狂增长。于是开始分析问题所在:

1.通过任务管理器,发现用户层的程序内存和虚拟内存使用都非常稳定,排除它泄露内存的可能。

2.驱动层程序查找所有动态分配内存的地方,都找到了相应的释放函数。也排除了驱动层泄露的可能。

3.不放心驱动层,在所有分配的释放的地方都打印日志。观察发现还是正常的。

经过上面分析,发现都被排除了。但PF值在增加是个事实。后来找到了PoolMon工具(可以微软网站上下载到),用它来观察,发现有个TAG确实分析了内存没有释放。

后来决定采用注释部分功能的方式来测试问题所在。几轮下来,驱动层只剩框架了,还有泄露。开始尝试用户态程序(看来看任务管理器的方法不太靠谱)。

一轮一轮的注释,终于发现 调用CreateToolhelp32Snapshot之后,没有调用CloseHandle关闭句柄。用户层调用竟然会产生内核内存泄露,教训啊,以后一定要记住关Handle
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: