【问题标题】:Visual Studio breakpoints -- break on specific file accessVisual Studio 断点——在特定文件访问时中断
【发布时间】:2010-12-15 14:47:03
【问题描述】:

当读取或写入特定文件时,有什么方法可以让 VS 调试会话中断?

在这种情况下,我想将其用作探索工具——假设我不知道从大型代码库中的哪个位置访问该文件,或者设置文件名的位置——它可能会被选中从一些大规模配置的深处开始。

【问题讨论】:

    标签: .net visual-studio debugging breakpoints


    【解决方案1】:

    我要做的只是快速创建一个静态类,它使用FileSystemWatcher class 来监听文件创建/更改事件,并在事件回调中放置一个断点,或者在那里调用System.Diagnostics.Debugger.Break

    然后,当它中断时,切换到“线程”窗口并尝试定位线程和执行实际文件访问的代码。

    如果您需要大量使用它,请让此类维护您要中断的特定文件名列表,并公开两个公共静态方法:开始和停止监听特定文件中的更改。

    另外,如果您有 VS2010 Ultimate,您可以简单地在 IntelliTrace 事件日志中搜索文件创建事件列表。

    【讨论】:

    • 我没试过,但它很可能是天才。昨天我在考虑 FileSystemWatcher,希望有什么方法可以把它挂起来。好主意,试试看。
    【解决方案2】:

    如果您对任何文件的访问感兴趣,而不仅仅是写入文件,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();
                }
            };
        }
    }
    

    【讨论】:

    • 谢谢,特别是在提出问题后这么长时间才接听。为什么要使用 GC.KeepAlive?拥有一个静态 fs 句柄或句柄列表会产生相同的效果吗?
    • KeepAlive 调用是为了确保 FileStream 没有被 GC,因为局部变量在方法中最后一次使用后不能保证保持活动状态。是的,在静态字段或集合中保留引用也可以:-)
    【解决方案3】:

    目前我的流程必须是:

    • 在文件中查找文件名或部分文件名
    • 在配置文件中查找文件名或部分文件名
    • 根据文件名或内容猜测对象,在代码库中查找对象,中断方法条目
    • (如果是 xml,则在 ReadXml 上中断以找出打开的位置...)

    虽然笨重但确实有效......

    【讨论】:

      【解决方案4】:

      你可以设置一个条件断点。

      假设您有一个存储文件名的字符串变量 strFileName。

      在读取文件的那一行,设置断点。右键单击断点,然后单击“条件...”。

      在对话框中做:

      strFileName = "TheSpecificFileName.txt"
      

      如果正在读取的文件名可用,则可以完成这项工作。

      【讨论】:

      • 谢谢——但我假设我不知道从大型代码库中的哪个位置访问该文件,或者设置文件名的位置——它可能是从某个大型代码库的深处获取的规模配置。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-06
      • 1970-01-01
      • 1970-01-01
      • 2011-05-16
      相关资源
      最近更新 更多