3

IOException別のプロセスで使用されているため、ファイルを削除できないことに注意して、定期的に を発生させるテストをデバッグしています。プロセスは確かに私のテスト ハーネスであり、プロセス内の他のスレッドは、期待したときにそのファイル リソースを破棄していないのではないかと思います。

どのスレッドが妨害ロックを保持しているかを判断するために使用できるツールはありますか? スレッドを特定できれば、そのコール スタックを調べて、少なくともリソースがまだ破棄されていない理由を特定することができます。SOS デバッグ ツールは有望に見えますが、私の調査からかなりの量の当て推量を取り除く機能は見当たりません。

1 つの考えとしては、ネイティブ OS スレッド ID を識別し、SOS を介してマネージド スレッド ID にマップすることができます。どうすれば前者を達成できますか?

4

3 に答える 3

5

SysInternalsツールからProcessExplorerを使用できます。http://technet.microsoft.com/en-us/sysinternals/bb896653 それを開いて、ファイル名を検索するだけです。どのプロセスがロックされているかが表示されます。


編集:

ああ、私はそれを読み直して、あなたが特定のスレッドを求めていることに気づきました。ProcessExplorerでそれができるかどうかはわかりません。ごめん!


編集2:

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

  }
}
于 2011-06-14T19:42:40.360 に答える
2

try{delete();}catch(IOException)catch 句にブレークポイントを配置した場合。各スレッドのコールスタックを見ることはできませんか?

于 2011-06-14T19:41:45.600 に答える
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>
于 2011-06-15T16:11:18.860 に答える