执行堆栈/ .NET AppDomain保存文件句柄的是什么?

时间:2012-01-21 07:33:55

标签: .net windows file debugging windbg

我有.NET可执行文件,它在分离的AppDomain中托管插件。 有时在应用程序使用期间,其中一个插件会锁定文件并阻止其移动或删除。

我需要找出谁拥有文件句柄?

问题是间歇性的,难以复制。有5个插件。 禁止插件访问此文件或终止句柄(如Unlocker确实)不是解决方案。

我试过了:

首先,Sysinternals - 但它只显示拥有指定名称的文件的进程。

其次,正如关于WinDbg的文章和文档所述,我可以使用!process和!handle,但接下来:

0:001> !process
No export process found 
0:001> !handle 314 ff 123 
Unknown type '123

我可以使用!带有较少参数的句柄,但是我的版本(原因不明)甚至没有像Debug Tutorial Part 5: Handle Leaks那样显示文件名。我的可执行文件引用了100个文件。 我想深入了解WinDbg的方向,但出于某种原因,从Windows 7 SDK安装它的功能与文档中的说明不同,这阻止了我的进一步调查?

我有:

WinDbg 6.12.0002.633 x86(我的进程是32位)

Windows 7 SP1 x64

1 个答案:

答案 0 :(得分:2)

如果您知道文件被锁定,那么最简单的方法是在您的进程上运行ProcMon并监视该文件并查看打开它的线程,然后在windbg中检查该线程。您可以通过右键单击操作并转到属性来查看哪个线程在procmon中打开了一个文件。这将为您提供线程ID和线程堆栈跟踪。

如果你不能这样做,我会尝试完全卸载windbg,然后安装x64版本。 x64可以打开x86和x64,然后再次尝试命令。