从特定文件读取或写入特定文件时,是否有任何使VS调试会话中断的方法?
在这种情况下,我想将其用作探索工具-假设我不知道在大型代码库中的哪个位置访问该文件,或者在哪里设置了文件名-可能会选择它从深处进行大规模配置。
[我要做的就是快速破解一个静态类,该类使用FileSystemWatcher class来监听文件创建/更改的事件,并在事件回调中放置一个断点,或在那里对System.Diagnostics.Debugger.Break进行调用。
然后,当它中断时,切换到“线程”窗口,并尝试找到进行实际文件访问的线程和代码段。
如果需要大量使用,请让此类维护要中断的特定文件名的列表,并公开两个公共静态方法:启动和停止侦听特定文件中的更改。
此外,如果您拥有VS2010 Ultimate,则可以在IntelliTrace事件日志中简单地搜索“文件创建”事件的列表。
如果您对any对文件的访问感兴趣,而不仅仅是对其写入,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();
}
};
}
}
当前我的流程必须是:
虽然笨重但确实有效...
您可以设置条件断点。
假定您具有存储文件名的字符串变量strFileName。
在读取文件的行上,设置一个断点。右键单击断点,然后单击“条件...”。
在对话框中执行:
strFileName = "TheSpecificFileName.txt"
如果正在读取的文件名可用,则将完成此工作。