3

我知道如果我们提供 Handle.exe 的绝对路径,它将列出锁定文件的所有进程。

F:\Softwares\Handle>Handle.exe  D:\Source\sample.dll

Handle v4.0
Copyright (C) 1997-2014 Mark Russinovich
Sysinternals - www.sysinternals.com

test1.exe           pid: 9928   type: File           408: D:\Source\sample.dll
test2.exe           pid: 10840  type: File           6A8: D:\Source\sample.dll
test3.exe           pid: 15788  type: File           374: D:\Source\sample.dll
test4.exe           pid: 10940  type: File           308: D:\Source\sample.dll
test5.exe           pid: 15424  type: File           3FC: D:\Source\sample.dll
test6.exe           pid: 10076  type: File           8AC: D:\Source\sample.dll

视窗 7 64 位

正如 Handle.exe 所述,我的 sample.dll 被 6 个不同的进程锁定。我想知道哪一行代码实际上保存了每个进程的 sample.dll。我的任务是修复我庞大的应用程序中的句柄泄漏。所以我的问题并没有固定到程序的特定部分。任务是我必须生成包含句柄泄漏诊断谁创建它的报告。泄漏并非特定于文件,它扩展到所有系统资源,如文件、注册表项、事件、信号量、线程...等。

我已经使用 windbg 进行了转储,但我找不到如何诊断转储文件,尤其是处理泄漏。在我大约半天的搜索中,找不到适合我的问题的好的教程或解决方案。

是否有任何命令行工具或任何其他工具可以回答我的问题。

4

2 回答 2

4

您使用了错误的调试工具。您想阅读这篇文章,它详细介绍了如何使用!htrace调试器命令获取泄漏句柄的堆栈跟踪。这个现有的SO 问题也涵盖了这一点。

您会看到经常提到的“Windows 调试工具”。它不再是单独的下载,而是包含在 Windows SDK 安装中。

于 2015-02-13T10:23:01.783 回答
0

我认为您可以使用另一个Sysinternals工具procmon找到罪魁祸首。

它会让你开心,唯一的问题是句柄创建速度非常慢 - 你不能记录系统活动超过十分之几分钟......除非你的系统安装了大量的内存。

一旦你记录了你的事件(不要忘记以管理员身份运行它,并在几分钟后停止它,我更喜欢在通常停止它后分析捕获的数据)进入菜单“工具”->“文件摘要”并在那里找到访问的文件。

双击文件(或目录、文件夹视图等...双击“anywehere”),将在 procmon 视图中添加一个过滤器,让您分析由任何进程执行的与它相关的每一个操作在系统中运行。

如果您双击单个操作,您还可以在该系统调用的上下文中查看堆栈的回溯,以及有关 I/O(在此特定情况下)操作的更多详细信息。

于 2015-02-20T09:39:59.670 回答