一、准备工作
1 打开windbg
2 File->Symbol File Path,配置好符号文件(PDB)

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

二、快照
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。

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

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

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

任务管理器
1 调出句柄列


2 查看句柄数

注意:
1 在使用windbg进行句柄泄漏调试时,需要注意程序位数的匹配,如:windbg32只能用来调试32位程序,windbg64只能用来调试64位程序。
2 在使用windbg附着进程时,windbg会打印出进程所有模块的地址范围。
3 Process Explorer还可以用于查看进程加载的动态库以及动态库的基地址信息。
4 windbg在加载时会打印出加载的动态库以及动态库的基地址信息。
网友评论