【发布时间】:2015-02-10 12:26:38
【问题描述】:
我知道如果我们提供 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
Windows 7 64 位
正如 Handle.exe 所述,我的 sample.dll 被 6 个不同的进程锁定。 我想知道哪一行代码实际上保存了每个进程的 sample.dll。 我的任务是修复我庞大的应用程序中的句柄泄漏。所以我的问题并没有固定到程序的特定部分。 任务是我必须生成包含句柄泄漏诊断谁创建它的报告。 泄漏并非特定于文件,它扩展到所有系统资源,如文件、注册表项、事件、信号量、线程...等。
我已经使用 windbg 进行了转储,但我找不到如何诊断转储文件,尤其是针对句柄泄漏。在我大约半天的搜索中,找不到适合我的问题的好的教程或解决方案。
是否有任何命令行工具或任何其他工具可以回答我的问题。
【问题讨论】:
-
在没有可读调试信息 (PDB) 的已编译应用程序中,这是不可能的。代码行和它在编译时生成的汇编语句之间没有固定的关系,因此通常不可能将语句追溯到高级代码。使用完全解释的语言和一些混合解释器运行时,这可能是可能的,但这远非普遍。
-
此外,即使有可能。理论上它可以是任意数量的行。你到底想解决什么问题?
-
@Ramhound 在我上面的示例中 D:\Source\Sample.dll 被 6 个进程锁定。在我的应用程序中,这是由某些部分代码加载的,并且没有正确发布。有类似的问题,如句柄泄漏、文件、注册表项、事件...等。我的问题是代码的哪一部分锁定了手柄?我想要一个实用的解决方案
-
通常,DLL 加载是在程序代码之外处理的。您只需包含一个 dll,编译器和加载器会负责其余的工作。对于(非dll)外部资源泄漏,正确实现try-finally结构,保证即使发生crash也能释放资源。短期锁定发生在读取时,而长期锁定发生在打开文件进行写入或主动写入时。
-
@Srikanth - 每次从 dll 加载符号然后调用该代码时,您都会创建对 dll 的依赖项。你有这些进程的调试信息吗?
标签: windows-7 sysinternals handle