错误调用CreateToolhelp32Snapshot导致内核内存泄露
2010-12-10 12:47
295 查看
前段时间写了一个驱动层程序,做好了驱动层,写了与其交互的用户层,结果运行时发现内存泄露严重,运行一段时间后,windows开始提示虚拟内存过低,观察任务管理器当中的PF值,发现它在疯狂增长。于是开始分析问题所在:
1.通过任务管理器,发现用户层的程序内存和虚拟内存使用都非常稳定,排除它泄露内存的可能。
2.驱动层程序查找所有动态分配内存的地方,都找到了相应的释放函数。也排除了驱动层泄露的可能。
3.不放心驱动层,在所有分配的释放的地方都打印日志。观察发现还是正常的。
经过上面分析,发现都被排除了。但PF值在增加是个事实。后来找到了PoolMon工具(可以微软网站上下载到),用它来观察,发现有个TAG确实分析了内存没有释放。
后来决定采用注释部分功能的方式来测试问题所在。几轮下来,驱动层只剩框架了,还有泄露。开始尝试用户态程序(看来看任务管理器的方法不太靠谱)。
一轮一轮的注释,终于发现 调用CreateToolhelp32Snapshot之后,没有调用CloseHandle关闭句柄。用户层调用竟然会产生内核内存泄露,教训啊,以后一定要记住关Handle
1.通过任务管理器,发现用户层的程序内存和虚拟内存使用都非常稳定,排除它泄露内存的可能。
2.驱动层程序查找所有动态分配内存的地方,都找到了相应的释放函数。也排除了驱动层泄露的可能。
3.不放心驱动层,在所有分配的释放的地方都打印日志。观察发现还是正常的。
经过上面分析,发现都被排除了。但PF值在增加是个事实。后来找到了PoolMon工具(可以微软网站上下载到),用它来观察,发现有个TAG确实分析了内存没有释放。
后来决定采用注释部分功能的方式来测试问题所在。几轮下来,驱动层只剩框架了,还有泄露。开始尝试用户态程序(看来看任务管理器的方法不太靠谱)。
一轮一轮的注释,终于发现 调用CreateToolhelp32Snapshot之后,没有调用CloseHandle关闭句柄。用户层调用竟然会产生内核内存泄露,教训啊,以后一定要记住关Handle
相关文章推荐
- 内核中accept连接时创建socket结构错误导致的内存泄露
- VC:快速侦测断言错误导致的内存泄露
- 【转】performSelector延时调用导致的内存泄露
- performSelector延时调用导致的内存泄露
- 内核模块中错误调用kernel_thread创建内核线程导致模块无法卸载
- performSelector延时调用导致的内存泄露
- performSelector延时调用导致的内存泄露
- performSelector一系列方法调用和延时调用导致的内存泄露
- performSelector延时调用导致的内存泄露
- PerformSelector延时调用导致的内存泄露
- [转]performSelector延时调用导致的内存泄露
- UIActionSheet关闭动画过程中调用delegate = nil 导致的内存泄露
- performSelector延时调用导致的内存泄露
- performSelector延时调用导致的内存泄露
- 循环引用导致内存泄露 dealloc无法调用
- ArrayList 与HashSet的比较,及应用反射读取properties配置文件中的数据进行实例化再调用,以及类加载器的使用;还有HashCode的分析,及导致内存泄露,内存溢出的原因之一
- 一个很初级的错误 Destructor忘记override导致内存泄露
- performSelector延时调用导致的内存泄露
- performSelector延时调用导致的内存泄露
- performSelector延时调用导致的内存泄露