我正在调试定期引发 IOException
的测试,注意到无法删除文件,因为它正被另一个进程使用。我怀疑该进程确实是我的测试工具,并且该进程中的某些其他线程没有按我的预期处理其文件资源。
有没有一种工具可以用来确定哪个线程持有阻碍锁?如果我可以识别线程,那么我可以检查它的调用堆栈并至少尝试确定资源尚未释放的原因。 SOS debugging tool看起来很有希望,但我没有看到任何功能可以消除我调查中的大量猜测。
一种想法是识别 native 操作系统线程 ID,然后可以通过 SOS 将其映射到托管线程 ID。我将如何完成前者?
最佳答案
您可以使用 SysInternals 工具中的 Process Explorer。 http://technet.microsoft.com/en-us/sysinternals/bb896653 只需打开它并搜索您的文件名。它会告诉你哪些进程锁定了它。
编辑:
哦,我刚刚重读了一遍,发现您要求的是特定主题。我不知道 ProcessExplorer 是否可以做到这一点。对不起!
编辑 2:
第二个答案,扩展了 agent-j 的答案:
如果您可以编辑代码并在其周围添加一个 try/catch 以获得 IOException,您还可以记录堆栈跟踪,因为这听起来像是您要检查的内容:
catch(IOException)
{
LogMessage( string.Format(
"Managed Thread Id: {0}",
System.Threading.Thread.CurrentThread.ManagedThreadId) );
LogMessage( string.Format(
"Stack Trace: {0}",
new System.Diagnostics.StackTrace(true).ToString()) );
}
编辑 3
使用上述方法,您还可以记录进程中所有线程的线程和堆栈跟踪,从而更容易查看日志并找出事后发生的情况。更新代码:
catch(IOException)
{
foreach (var thread in System.Diagnostics.Process.GetCurrentProcess().Threads)
{
LogMessage(string.Format(
"Managed Thread Id: {0}",
thread.ManagedThreadId));
LogMessage(string.Format(
"Stack Trace: {0}",
new System.Diagnostics.StackTrace(thread, true).ToString()));
}
}
关于.net - 哪个调试工具(如果有)允许我识别持有文件锁的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6349032/