Visual Studio断点 - 中断特定文件访问

时间:2010-12-15 14:47:03

标签: visual-studio debugging file-io breakpoints

在读取或写入特定文件时,有没有办法让VS调试会话中断?

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

4 个答案:

答案 0 :(得分:3)

我要做的就是快速破解使用FileSystemWatcher class监听文件创建/更改事件的静态类,并在事件回调中放置断点,或者调用{{3}那里。

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

如果你需要经常使用它,请让这个类维护你想要打破的特定文件名列表,并公开两个公共静态方法:启动和停止监听特定文件中的更改。

此外,如果你有VS2010 Ultimate,你只需搜索IntelliTrace事件日志中的File Created事件列表。

答案 1 :(得分:3)

如果您对任何对文件的访问感兴趣,而不仅仅是写入文件,FileSystemWatcher将无济于事。

一个简单的解决方案是提前打开文件并等待其他逻辑访问它,触发IOException。您可以使用以下帮助程序类立即中断 - 或VS的“First Chance Exception”功能:

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

答案 2 :(得分:1)

目前我的流程必须是:

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

这很笨重但确实有用......

答案 3 :(得分:0)

您可以设置条件断点。

假设您有一个字符串变量strFileName,其中存储了文件名。

在读取文件的行上,设置断点。右键单击断点并单击"条件..."。

在对话框中执行:

strFileName = "TheSpecificFileName.txt"

如果正在读取的文件名可用,那就可以胜任。