当从特定文件读取或写入特定文件时,是否有任何方式让VS调试会话中断?Visual Studio断点 - 中断特定文件访问
在这种情况下,我想将它用作探索性工具 - 假设我不知道从大型代码库中访问此文件的位置,或者文件名被设置的位置 - 可能是在某些大型配置中从深层拾取。
当从特定文件读取或写入特定文件时,是否有任何方式让VS调试会话中断?Visual Studio断点 - 中断特定文件访问
在这种情况下,我想将它用作探索性工具 - 假设我不知道从大型代码库中访问此文件的位置,或者文件名被设置的位置 - 可能是在某些大型配置中从深层拾取。
我会做的只是快速破解静态类,它使用FileSystemWatcher class来侦听文件创建/更改的事件,并在事件回调中放置断点,或在那里打电话给System.Diagnostics.Debugger.Break。
然后,当它打破,切换到线程窗口,并尝试找到线程和一段代码,没有实际的文件访问。
如果你需要使用这个有很多,有这个类保持要打破特定文件名的列表,并公开两个公共静态方法:启动和停止收听特定文件更改。
另外,如果你有VS2010旗舰版,你可以简单地通过在事件日志中的IntelliTrace文件创建的事件列表中搜索。
您可以设置一个条件断点。
让我们假设你有一个字符串变量strFileName所在的文件名存储。
在该文件读取行,设置一个断点。右键单击断点并单击“条件...”。
在对话框中做到:
strFileName = "TheSpecificFileName.txt"
如果文件名是可用的正在读这将做的工作。
谢谢 - 但我假设我不知道在一个大的代码库这个文件从访问,或文件名被设置的地方 - 在某些大规模的配置中,它可以从深处获得。 – 2010-12-15 14:54:25
目前我的过程必须是:
这是笨重的但工作...
如果你有兴趣任何访问该文件,而不是只写入它,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句柄或句柄列表具有相同的效果? – 2014-01-27 11:23:19
KeepAlive调用是为了确保FileStream不是GC'd,因为本地变量不保证在方法中最后一次使用后保持活动状态。是的,在一个静态字段或集合中保留一个引用就可以提供:-) – staafl 2014-01-27 11:28:38
我没有尝试过,但它很可能是天才。我昨天在想FileSystemWatcher,希望有办法挂钩它。好主意,会让它变好。 – 2010-12-18 20:46:38