在读取或写入特定文件时,有没有办法让VS调试会话中断?
在这种情况下,我想将它用作探索性工具 - 假设我不知道从大型代码库中访问此文件的位置,或者文件名设置的位置 - 可能会被选中在一些大规模的配置中深入。
答案 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)
目前我的流程必须是:
这很笨重但确实有用......
答案 3 :(得分:0)
您可以设置条件断点。
假设您有一个字符串变量strFileName,其中存储了文件名。
在读取文件的行上,设置断点。右键单击断点并单击"条件..."。
在对话框中执行:
strFileName = "TheSpecificFileName.txt"
如果正在读取的文件名可用,那就可以胜任。