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

来源:互联网 发布:mac装win7升级安装 编辑:程序博客网 时间:2024/05/17 12:51

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

 

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

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

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

 

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

 

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

 

一轮一轮的注释,终于发现 调用CreateToolhelp32Snapshot之后,没有调用CloseHandle关闭句柄。用户层调用竟然会产生内核内存泄露,教训啊,以后一定要记住关Handle