【发布时间】:2010-12-15 14:47:03
【问题描述】:
当读取或写入特定文件时,有什么方法可以让 VS 调试会话中断?
在这种情况下,我想将其用作探索工具——假设我不知道从大型代码库中的哪个位置访问该文件,或者设置文件名的位置——它可能会被选中从一些大规模配置的深处开始。
【问题讨论】:
标签: .net visual-studio debugging breakpoints
当读取或写入特定文件时,有什么方法可以让 VS 调试会话中断?
在这种情况下,我想将其用作探索工具——假设我不知道从大型代码库中的哪个位置访问该文件,或者设置文件名的位置——它可能会被选中从一些大规模配置的深处开始。
【问题讨论】:
标签: .net visual-studio debugging breakpoints
我要做的只是快速创建一个静态类,它使用FileSystemWatcher class 来监听文件创建/更改事件,并在事件回调中放置一个断点,或者在那里调用System.Diagnostics.Debugger.Break。
然后,当它中断时,切换到“线程”窗口并尝试定位线程和执行实际文件访问的代码。
如果您需要大量使用它,请让此类维护您要中断的特定文件名列表,并公开两个公共静态方法:开始和停止监听特定文件中的更改。
另外,如果您有 VS2010 Ultimate,您可以简单地在 IntelliTrace 事件日志中搜索文件创建事件列表。
【讨论】:
如果您对任何文件的访问感兴趣,而不仅仅是写入文件,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"
如果正在读取的文件名可用,则可以完成这项工作。
【讨论】: