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

Ste*_*idi 3 .net io file-locking sos ioexception

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

有没有一个工具可以用来确定哪个线程阻挡了阻碍锁?如果我可以识别线程,那么我可以检查它的调用堆栈,并至少尝试确定资源尚未处理的原因.该SOS调试工具看起来很有希望,但我不认为这会从我的调查中删除的猜测相当数量的任何特征.

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

Cod*_*ike 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()) );
}
Run Code Online (Sandbox Code Playgroud)

编辑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()));

  }
}
Run Code Online (Sandbox Code Playgroud)