2010-12-15 44 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