Точки останова Visual Studio - перерыв при доступе к конкретному файлу - PullRequest
7 голосов
/ 15 декабря 2010

Есть ли способ прервать сеанс отладки VS, когда определенный файл считывается или записывается в?Не знаю, откуда в большой кодовой базе осуществляется доступ к этому файлу или где задается имя файла - он может быть взят из глубины в какой-то крупномасштабной конфигурации.

Ответы [ 4 ]

3 голосов
/ 24 января 2014

Если вас интересует любой доступ к файлу, а не просто запись в него, 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();
            }
        };
    }
}
3 голосов
/ 18 декабря 2010

То, что я хотел бы сделать, это просто быстро взломать статический класс, который использует FileSystemWatcher class для прослушивания событий создания / изменения файла и установки точки останова в обратном вызове события или вызова System.Diagnostics.Debugger.Break там.

Затем, когда он сломается, переключитесь в окно Threads и попытайтесь найти поток и фрагмент кода, который фактически выполнял доступ к файлу.

Если вам нужно часто это использовать, попросите этот класс вести список определенных имен файлов, на которые вы хотите разбить, и выставьте два общедоступных статических метода: запуск и остановка прослушивания изменений в определенном файле.

Также, если у вас VS2010 Ultimate, вы можете просто выполнить поиск по списку событий File Created в журнале событий IntelliTrace.

1 голос
/ 16 декабря 2010

В настоящее время мой процесс должен быть:

  • Найти в файлах имя файла или частичное имя файла
  • Найти в файлах конфигурации имя файла или частичное имя файла
  • Угадай объект по имени файла или содержимому, найди объект в базе кода, разбей на записи метода
  • (если xml, разбить ReadXml, чтобы узнать, где открыт ...)

что неуклюже, но работает ...

0 голосов
/ 15 декабря 2010

Вы можете установить условную точку останова.

Предположим, у вас есть строковая переменная strFileName, в которой хранится имя файла.

В строке, где читается файл, установите точку останова.Щелкните правой кнопкой мыши точку останова и выберите «Условие ...».

В диалоговом окне выполните:

strFileName = "TheSpecificFileName.txt"

Это будет работать, если доступно имя файла, которое читается.

...