哪个调试工具(如果有的话)允许我识别锁定文件的线程?

时间:2011-06-14 19:35:41

标签: .net io ioexception sos file-locking

我正在调试一个定期引发IOException的测试,注意到一个文件无法被删除,因为它正被另一个进程使用。我怀疑这个过程确实是我的测试工具,并且进程中的其他一些线程在我预期的时候没有处理它的文件资源。

是否有一个工具可用于确定哪个线程包含阻碍锁定?如果我可以识别线程,那么我可以检查它的调用堆栈,并至少尝试确定资源尚未处理的原因。 SOS debugging tool看起来很有希望,但我没有看到任何可以从调查中消除大量猜测的功能。

一种想法是识别本机OS线程ID,然后可以通过SOS将其映射到托管线程ID。我将如何完成前者?

3 个答案:

答案 0 :(得分:5)

您可以使用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()));

  }
}

答案 1 :(得分:2)

如果在try{delete();}catch(IOException) catch子句中放置断点。你不能看看每个线程的callstack吗?

答案 2 :(得分:0)

线程不保存文件锁(至少不涉及操作系统)。请考虑以下示例。线程t创建一个文件并锁定该文件。主线程写入流并关闭它。这表明该线程不拥有该锁。这个过程确实如此。

     Stream stream = null;
     Thread t = new Thread(() => stream = File.OpenWrite (@"c:\temp\junk111.txt"));
     t.Start();
     Thread.Sleep(1000);
     Console.WriteLine(t.ThreadState);
     stream.WriteByte(89);
     stream.Close();
     File.OpenWrite (@"c:\temp\junk222.txt");

打印stopped,因此打开文件的线程不再运行,但它创建的文件句柄仍然打开。

以下是上述文件的FxCop结果的相关部分

C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop>FxCopCmd.exe /file:c:\code\jeremy.sellars\test\Junk\bin\Debug\Junk.exe /console
Microsoft (R) FxCop Command-Line Tool, Version 10.0 (10.0.30319.1) X86
Copyright (C) Microsoft Corporation, All Rights Reserved.

...
[Location not stored in Pdb] : warning  : CA2210 : Microsoft.Design : Sign 'Junk.exe' with a strong name key.
C:\code\jeremy.sellars\TEST\Junk\Program.cs(50,1) : warning  : CA2000 : Microsoft.Reliability : In method 'Program.Main()', call System.IDisposable.Dispose on object 'File.OpenWrite("c:\\temp\\junk2.txt")' before all references to it are out of scope.
Done:00:00:06.1251568

C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop>