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



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

有没有一种工具可以用来确定哪根螺纹固定阻碍锁?如果我能够识别线程,那么我就可以检查它的调用堆栈,并至少尝试确定资源尚未被释放的原因。SOS调试工具看起来很有前景,但我看不到任何功能可以从我的调查中消除相当多的猜测。

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

您可以从SysInternal工具使用Process Explorer。http://technet.microsoft.com/en-us/sysinternals/bb896653只需打开它并搜索您的文件名。它会显示哪些进程有锁定。


编辑:

哦,我刚重读了一遍,注意到你问了具体的线索。我不知道ProcessExplorer是否能做到这一点。很抱歉


编辑2:

第二个答案,扩展了代理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()));
  }
}

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

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

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

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

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

C:Program Files (x86)Microsoft Visual Studio 10.0Team ToolsStatic Analysis ToolsFxCop>FxCopCmd.exe /file:c:codejeremy.sellarstestJunkbinDebugJunk.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:codejeremy.sellarsTESTJunkProgram.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.0Team ToolsStatic Analysis ToolsFxCop>

最新更新