WinDbg 定位句柄泄漏问题
文章目录
- 一、观察进程是否有句柄泄漏
- 1、查看工具
- 任务管理器查看句柄数
- procexp.exe查看进程句柄信息
- 2、判断是否有句柄泄漏
- 二、定位方法
- 1、WinDbg分析句柄泄漏
- 1.1 Event句柄泄漏
- 1.1.1 代码示例
- 1.1.2
一、观察进程是否有句柄泄漏
1、查看工具
使用任务管理器或Process Explorer(procexp.exe)工具可观察进程的句柄数。
任务管理器查看句柄数
procexp.exe查看进程句柄信息
2、判断是否有句柄泄漏
通常在程序运行稳定后,再观察句柄数有无增长,比如进程启动5分钟后再开始观察,让其运行半天或一天,比较前后的句柄数有无明显增长。
可以使用性能监视工具或者在Procexp.exe选中进程,点击菜单中的保存可以存成txt文本查看,可以通过比较前后两次的txt查看哪些句柄有泄漏。
二、定位方法
1、WinDbg分析句柄泄漏
1.1 Event句柄泄漏
1.1.1 代码示例
#include "stdafx.h"
#include <ctime>void HandleLeak()
{for (int i = 0; ; i++){CreateEvent(NULL, true, false, NULL);Sleep(10000);}
}int _tmain(int argc, _TCHAR* argv[])
{HandleLeak();system("pause");return 0;
}
生成文件名为testC.exe
1.1.2
1)打开WinDbg,设置好pdb路径以及源码路径
2)打开exe
3)在WinDbg命令窗口中执行g
回车换行,进程启动了
4)过一会后,点击WinDbg菜单栏的Break或者按下Ctrl+Break
5)此时分别执行以下命令
!htrace -enable:启用handle trace,并且创建第一个快照作为初始状态,方便使用 -diff选项
!htrace:显示当前的所有句柄信息
!htrace -snapshot:创建快照,用作-diff选项
执行一下g命令,同3)
6)过一会后,break掉,同4),在WinDbg命令窗口执行
!htrace -diff:使用当前状态的信息,和最近一次的快照信息做对比
由图可知,和快照做对比,发现比快照多了7个handle
7)根据6)中的handle值,执行
!handle xxx f:查看一下handle的信息
从这里可以知道这个handle的类型是event
8)在有源码和pdb的情况下,可以使用 lsa命令定位到源码所在位置,如
lsa KERNELBASE!CreateEventExW+0x0000000000000056
当然这里因为是windows内部的模块,没有加pdb和源码,因此不会显示到对应行
9)根据7),我们看不见是我们那一行代码导致的问题,因此可以反汇编获取函数的返回地址,如下:
我们找到返回地址,图中箭头位置,拿到7713a02a
10)调试一下断点
.logappend /u e:/test.log:表示将此命令的结果Append到e:/test.log文件中,/u表示 in Unicode format。
k :表示输出栈信息
r eax:表示输出eax寄存器的值,即取函数的返回值
.logclose:表示关闭日志记录
g:表示命中断点后继续执行
11)打开test.log
由日志去查看源代码,发现CreateEvent后没有close的操作,到此就定位出了Event句柄泄漏的位置。
备注:当我们从文件得知可能出现句柄泄漏的句柄时,我们可以用windbg挂对应的进程,等对应的进程或目录或其他名称出现,这个时候用procexp看对应句柄值,再在windbg执行!htrace -diff的内容中查找对应的句柄值。
WinDbg 定位句柄泄漏问题相关推荐
- 句柄 android,android句柄泄漏
前言 在android开发过程中,跑一些单元测试,很容易暴露出文件句柄泄漏的问题.前段时间就有这么一个bug,最后确定是文件句柄泄漏的问题.下面我记录下当时一步步如何查找定位句柄泄漏. 正文 首先让我 ...
- linux socket句柄泄露,socket句柄泄漏问题的定位: losf和strace的联合使用!
最近遇到一个socket句柄泄漏的问题, 我们来简要说说如何定位: 1. 确定哪个进程在泄漏, 可以用命令 lsof -n|awk '{print $2}'| sort | uniq -c | so ...
- 内核对象句柄泄漏检测
自制工具 翰华Box:https://hanhuabox.lanzous.com/b00zjq9uf 翰华Box - 开发日志:https://blog.csdn.net/qq_41517936/ ...
- 记一次 .NET 某流媒体独角兽 API 句柄泄漏分析
一:背景 1. 讲故事 上上周有位朋友找到我,说他的程序CPU和句柄都在不断的增长,无回头趋势,查了好些天也没什么进展,特加wx寻求帮助,截图如下: 看的出来这位朋友也是非常郁闷,出问题还出两个,气人 ...
- windbg调试句柄泄露
本人系统是win7 64位,待调试程序是32位.这里使用的方法是真机配合虚拟机同时调试的方法来找出句柄泄露的源码位置. 如果真机直接使用X64版本的windbg侦测句柄泄露时显示: 0:000:x86 ...
- Java 性能优化实战记录(2)---句柄泄漏和监控
前言: Java不存在内存泄漏, 但存在过期引用以及资源泄漏. (个人看法, 请大牛指正) 这边对文件句柄泄漏的场景进行下模拟, 并对此做下简单的分析. 如下代码为模拟一个服务进程, 忽略了句柄关闭, ...
- 用mtrace定位内存泄漏
一. 缘起 有的公众号读者,看完我上次写给大学生的查bug方法后,希望我多分享一些查bug的实践经验和具体步骤,比如如何查内存泄漏和core dump问题.所以,就打算写这篇文章. 二. 内存泄漏简介 ...
- 句柄泄漏与应用程序体验查找服务(AELookupSvc)
描述信息:在运行 Windows Server 2003 sp1或sp2 的计算机上,句柄泄漏可能会出现在应用程序体验查找服务 (AELookupSvc).位置c:\windows\system32\ ...
- linux下使用命令行辅助定位内存泄漏问题
文章目录 前言 一.free命令: 命令 内容解释 其它 二.top命令 命令 其它 三. cat /proc/$pid/status 命令 内容解释 总结 前言 最近自己正在做的一款产品,因内存泄漏 ...
- linux如何定位内存泄漏,快速定位内存泄漏的套路(linux)
快速定位内存泄漏的套路(linux) 快速定位内存泄漏的套路(linux) https://blog.csdn.net/xieyihua1994/article/details/105248362/ ...
最新文章
- 3、基于多播、安全认证的corosync集群(VIP、Httpd、Filesystem)
- python爬虫抓收费图片_简单的Python抓taobao图片爬虫
- MySQL Table--独立表空间
- git remote: HTTP Basic: Access denied
- PHP文件系统-文件上传类
- eclipse maven 构建简单springmvc项目
- 【iHMI43 4.3寸液晶模块】demo例程(版本1.02)发布
- 第七节:框架搭建之页面静态化的剖析
- mysql中%3c%3e和=_Grafana+Prometheus 监控 MySQL
- CentOs基础操作指令(压缩、定时任务调度)
- python下载手机版-python
- 宝塔面板如何部署Java项目教程【新版】
- Procez One 快速入门(4)
- matlab势场动态栅格路径规划,融栅格法和人工势场法的机器人三维路径规划
- MySQL手册chm格式文档
- 虚拟串口模拟器和串口调试助手使用教程
- ESP32笔记(2) flash使用
- 网页中使用iconfont图标
- msxml3.dll 错误 '80072efd' ---asp 网站报错
- vue实现li列表的新增删除和修改
热门文章
- 《中国近代史纲要》考试过关?Python帮你划重点
- 微信公众平台接口API
- 划重点 2022面试必刷461道大厂架构面试真题汇总+面经+简历模板
- 农户在集市上卖西瓜,他总共有1020个西瓜,第一天卖掉一半多两个,第二天卖掉剩下的一半多两个, 问照此规律实下去,该农户几天能将所有的西瓜卖完。C语言
- 计算机用户名携带中文路径,Win10 User下的中文用户名改成英文路径操作方法
- 1.余弦定理、两角和公式公式复习
- 为UBUNTU安装一个像千千静听一样的MP3播放器
- Android应用市场转移【2021-03-22】
- Cross-Modality Domain Adaptation
- IDEA告警:Field can be converted to a local varible