2010-12-15 6 views
7

特定のファイルの読み書き時にVSデバッグセッションが中断する方法はありますか?Visual Studioブレークポイント - 特定のファイルへのアクセスを中断する

この場合、私はそれを探索ツールとして使用したいと思います。このファイルがどこからアクセスされているのか、ファイル名がどこに設定されているのか分かりませんいくつかの大規模な設定で深いから拾った。

答えて

3

私はただちにFileSystemWatcher classを使用してファイルの作成/変更イベントを聞き、イベントコールバックにブレークポイントを入れる静的クラスをハッキングします。そこにSystem.Diagnostics.Debugger.Breakに電話をかけてください。

次に、破損したら、スレッドウィンドウに切り替えて、実際のファイルアクセスを行ったスレッドとコードを見つけようとします。

このクラスを頻繁に使用する必要がある場合は、このクラスで中断したい特定のファイル名のリストを維持し、特定のファイルの変更をリスニングする開始と停止の2つの公開静的メソッドを公開します。

また、VS2010 Ultimateをお持ちの場合は、IntelliTraceイベントログのFile Createdイベントのリストから簡単に検索できます。

+0

私はそれを試していないが、それはおそらく天才です。私はFileSystemWatcherについて昨日考えていました。それをフックする方法があることを祈っていました。 –

0

条件付きブレークポイントを設定できます。

ファイル名が格納されている文字列変数strFileNameがあるとします。

ファイルが読み込まれる行で、ブレークポイントを設定します。ブレークポイントを右クリックし、 "Condition ..."をクリックしてください。ダイアログで

が行います。ファイル名が読み込まれているが利用可能であれば仕事をするだろう

strFileName = "TheSpecificFileName.txt" 

+1

おかげで - しかし、大規模なコードベースでは、このファイルからアクセスされている場合、私は知らないと仮定し、またはAMどこのファイル名が設定されているのですか?大規模な設定では、深いところから取り出されます。 –

1

現在私のプロセスがなければならない:オブジェクトの

  • ファイル名のファイルで検索、またはファイル名の一部
  • は、ファイル名の設定ファイルで検索、またはファイル名の一部
  • 推測からファイル名や内容、方法エントリ
  • でブレーク、コードベースにオブジェクトを検索(XML場合、開かれた場所を見つけるためにReadXmlの説明に破る...)

これは厄介ですが動作します...

3

に興味がある場合は、に直接アクセスしてください。FileSystemWatcherは役に立ちません。

簡単な解決策は、ファイルをあらかじめ開いておき、他のロジックがアクセスするのを待って、IOExceptionをトリガーすることです。あなたはすぐに破るために、次のヘルパークラスを使用することができます - またはVSの「最初のチャンス例外」機能:

using System; 
using System.Diagnostics; 
using System.IO; 
using System.Threading; 

static class DebugHelper 
{ 
    public static void BreakOnFileAccess(string path) 
    { 
     var msg = Path.GetFullPath(path); 
     msg = "The process cannot access the file '" + msg; 
     msg = msg.ToUpper(); 

     var fs = File.Open(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None); 
     new Thread(() => { 
      while (true) 
      { 
       Thread.Sleep(Timeout.Infinite); 
       // ensure FileStream isn't GC'd as a local variable after its last usage 
       GC.KeepAlive(fs); 
      } 
     }).Start(); 

     AppDomain.CurrentDomain.FirstChanceException += (sender, e) => { 
      if (e.Exception is IOException && 
       e.Exception.Message.ToUpper().Contains(msg)) 
      { 
       Debugger.Break(); 
      } 
     }; 
    } 
} 
+0

ありがとう、特に質問が尋ねられてからずいぶん時間がかかる。なぜGC.KeepAliveですか?静的なfsハンドルまたはハンドルのリストを持つと同じ効果がありますか? –

+1

KeepAliveの呼び出しは、メソッド内で最後に使用された後にローカル変数が存続することが保証されていないため、FileStreamがGCでないことを確認することです。はい、静的なフィールドやコレクションに参照を保持することも同様に役立ちます:-) – staafl

関連する問題