2015-02-10 28 views
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 

64位Windows 7

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

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

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

+1

在没有可读的调试信息(PDB)的编译应用程序中,这是不可能的。代码行与编译时生成的汇编语句之间没有固定关系,因此通常不可能将语句追溯到高级代码。有了完全解释的语言和一些混合解释器运行时,这可能是可能的,但这是非常普遍的。 – 2015-02-10 12:33:53

+0

此外,即使这是可能的。理论上它可以是任意数量的线。你试图完全解决什么问题? – 2015-02-10 13:03:10

+0

@Ramhound在我上面的例子中D:\ Source \ Sample.dll被6进程锁定。在我的应用程序中,这是由代码的一部分加载,并没有正确释放。有类似的问题,例如句柄泄漏,文件,注册表键,事件等等。我的问题是哪部分代码锁定了句柄?我想要一个实用的解决方案 – Srikanth 2015-02-10 13:11:16

回答

4

您正在使用错误的调试工具。您想要阅读this article,它详细介绍了如何使用!htrace调试器命令获取泄漏句柄的堆栈跟踪。还包括this existing SO问题。

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

+0

谢谢我已经更新了我的帖子,也正如您所建议的那样,我已经使用windbg并且我不知道如何使用windbg进入代码级别。由于windbg的结果始终是内核中Object reference表的内存位置。 – Srikanth 2015-02-13 11:36:56

0

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

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

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

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

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

+0

您可以设置过滤器和“丢弃过滤的事件”,以允许procmon运行更长的时间而不会触及内存限制。 – Timbo 2015-07-27 23:13:08