2010-12-15 45 views
7

當從特定文件讀取或寫入特定文件時,是否有任何方式讓VS調試會話中斷?Visual Studio斷點 - 中斷特定文件訪問

在這種情況下,我想將它用作探索性工具 - 假設我不知道從大型代碼庫中訪問此文件的位置,或者文件名被設置的位置 - 可能是在某些大型配置中從深層拾取。

回答

3

我會做的只是快速破解靜態類,它使用FileSystemWatcher class來偵聽文件創建/更改的事件,並在事件回調中放置斷點,或在那裏打電話給System.Diagnostics.Debugger.Break

然後,當它打破,切換到線程窗口,並嘗試找到線程和一段代碼,沒有實際的文件訪問。

如果你需要使用這個有很多,有這個類保持要打破特定文件名的列表,並公開兩個公共靜態方法:啓動和停止收聽特定文件更改。

另外,如果你有VS2010旗艦版,你可以簡單地通過在事件日誌中的IntelliTrace文件創建的事件列表中搜索。

+0

我沒有嘗試過,但它很可能是天才。我昨天在想FileSystemWatcher,希望有辦法掛鉤它。好主意,會讓它變好。 – 2010-12-18 20:46:38

0

您可以設置一個條件斷點。

讓我們假設你有一個字符串變量strFileName所在的文件名存儲。

在該文件讀取行,設置一個斷點。右鍵單擊斷點並單擊「條件...」。

在對話框中做到:

strFileName = "TheSpecificFileName.txt" 

如果文件名是可用的正在讀這將做的工作。

+1

謝謝 - 但我假設我不知道在一個大的代碼庫這個文件從訪問,或文件名被設置的地方 - 在某些大規模的配置中,它可以從深處獲得。 – 2010-12-15 14:54:25

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句柄或句柄列表具有相同的效果? – 2014-01-27 11:23:19

+1

KeepAlive調用是爲了確保FileStream不是GC'd,因爲本地變量不保證在方法中最後一次使用後保持活動狀態。是的,在一個靜態字段或集合中保留一個引用就可以提供:-) – staafl 2014-01-27 11:28:38