windbg定位句柄泄漏

2018-10-22  本文已影响28人  龙翱天际

一、准备工作

1 打开windbg
2 File->Symbol File Path,配置好符号文件(PDB)


image.png

3 File->Attache to a Process->可以选择一个运行中的进程,并对其进行调试。


image.png

二、快照

1 让程序运行(按F5或输入命令:g)
2 程序执行到想要快照的时候,中断程序(Debug->Break)
3 开启句柄栈回溯(输入命令:!htrace -enable)
4 抓取快照(输入命令:!htrace -snapshot)

三 、执行操作,比较差异

1 让程序运行(按F5或输入命令:g)
2 执行操作
3 中断程序(Debug->Break)
4 !htrace -diff

四、找到代码行

1 查看泄漏的句柄
从下图中可以看出有一个句柄泄漏,该句柄时通过CreateEvent创建出来的事件,通过栈回溯可以看出该事件创建事件的函数:vlc_tester::on_pB_Open_clicked。


image.png

2 查找具体的代码行
lsa vlc_tester!vlc_tester::on_pB_Open_clicked+0x000000000000002c
从下图中可以看出具体的代码。


image.png
3 如果在栈回溯中看不到有用信息,还可以考虑在代码中打印出线程ID,再与句柄泄漏所在线程对比,确认在哪个线程泄漏的,缩小范围。
4 根据栈回溯的模块或模块地址也能找到是哪个模块泄漏的句柄。

五、Process Explorer

Process Explorer

1 显示句柄详细信息


image.png

2 查看程序占用的句柄,如果是命名句柄,可以可以直接在代码中找到该句柄


image.png

任务管理器

1 调出句柄

image.png
image.png

2 查看句柄数


image.png

注意:
1 在使用windbg进行句柄泄漏调试时,需要注意程序位数的匹配,如:windbg32只能用来调试32位程序,windbg64只能用来调试64位程序。
2 在使用windbg附着进程时,windbg会打印出进程所有模块的地址范围。
3 Process Explorer还可以用于查看进程加载的动态库以及动态库的基地址信息。
4 windbg在加载时会打印出加载的动态库以及动态库的基地址信息。
\color{red}{5 整个系统可分配的最大句柄数为1600万,所以一般不会出现句柄泄漏导致程序崩溃}

上一篇 下一篇

猜你喜欢

热点阅读