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

标签 .net io ioexception sos file-locking

我正在调试定期引发 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/

相关文章:

.Net Profiling API 方法

c# - 为什么这段代码会锁定我的文件?

c - 使用 fread 从文本文件读取时获取 '�' 或 '@' 符号

java.io.IOException : Server returns HTTP response code 505

scala - Scala io.Source.FromFile 是否返回任何类型的异常?

c# - ASP.NET VNext 是云优化的是什么意思?

.net - .NET 紧凑框架的 GPS 库

java - 如何在管道传输到/从 javas stdin/stdout 时捕获错误

c++ - C++ 中的字符串操作和文件 IO?

java - ExternalStorage 上的 FileNotFoundException,尽管我有读写权限