Подтвердить что ты не робот

С# Как сбросить все переменные и текущие значения во время выполнения

Существуют ли встроенные или сторонние библиотеки, позволяющие просто выгружать все переменные в памяти во время выполнения? Я хотел бы иметь возможность просматривать переменные и текущие значения аналогично их просмотру, ударяя точку разрыва и зависая над переменными, но фактически не останавливая выполнение программы (т.е. Просто получить снимок). Было бы хорошо, если бы он мог сбрасывать их в файл, который затем может быть открыт позже в программе, чтобы получить удобный интерфейс GUI для их просмотра, но простой текстовый файл дампа будет достаточно хорошим.

4b9b3361

Ответ 1

Я не могу придумать простой способ сделать это в общем виде. Что может работать программно, создавая файл дампа вашего текущего процесса. Вы можете сделать это с помощью P/Invoke в dbghelp.dll или создать cdb.exe для создания файла дампа. После того, как у вас есть файл, вы можете открыть его в отладчике для последующего анализа, используя SOS.dll с cdb.exe/windbg.exe или даже напишите отладчик script, чтобы сбрасывать нужные данные (в основном) автоматически.

Ответ 2

Я считаю, что какая-то структура ведения журнала поможет вам в этом...

Отъезд:

http://www.dotnetlogging.com/

На моем рабочем месте мы используем log4net, который очень хорошо работает для нас.

Итак, как же вы хотите сбросить все переменные для последующего анализа? Рассматривали ли вы сначала свой тест кода, чтобы снизить зависимость от отладчика и иметь набор автоматизированных тестов, проверяющих значения для вас?

Ответ 3

В прошлом я использовал YourKit.Net профилировщик для профилирования приложений .Net.

Пока я когда-либо использовал его для непосредственного подключения к работающим приложениям, Документация моментальных снимков указывает, что у них есть API-интерфейс профилировщика, который можно использовать для программной съемки дампов для последующего просмотра.

Код мудрый выглядит так просто, как следующее:

Controller c = new Controller();
String snapshotPath = c.CaptureSnapshot();

Я считаю, что вы можете загрузить файлы моментальных снимков в графический интерфейс YourKit позднее, чтобы просмотреть их.

Я не удивлюсь, если некоторые из других популярных профайлеров, таких как JetBrains dotTrace Performance и RedGates ANTS Performance Profiler имеют аналогичные программные API, но я не мог быстро найти документацию на своих сайтах (и я не хотел смотреть их веб-семинары, чтобы узнать, существует ли эта функция!)

Ответ 4

Для этого вы можете использовать WMemoryProfiler для

  • Получить все объекты во всех appdomains как массив объектов
  • Создайте дамп памяти собственного процесса.
  • Сериализация определенных объектов на диск

Чтобы это произошло, вам нужен Windbg, но Api WMemoryProfiler полностью управляется, и вы можете самостоятельно отлаживать свой процесс. Библиотека позаботится об обычных отладчиках, так как она обертывает Windbg в красивой доступной библиотеке.

Приведенный ниже код получает все экземпляры объектов System.Threading.Thread в массив объектов. Таким образом вы можете написать визуализатор для собственных объектов приложения во время выполнения. Другая перегрузка просто дает вам все объекты во всех AppDomains.

using (var debugger = new MdbEng())
{
  var dummy = new Thread(() => {});
  dummy.Name = "Dummy Thread";

  // Get all thread objects in all AppDomains
  var threads = debugger.GetObjects("System.Threading.Thread", true);

  foreach (Thread t in threads)
  {
    Console.WriteLine("Managed thread {0} has Name {1}", t.ManagedThreadId, t.Name);
  }
  GC.KeepAlive(dummy);
}

Так как это оболочка вокруг Windbg, вы также можете создать дамп памяти на лету, а затем загрузить дамп памяти из своего процесса, чтобы извлечь данные объекта для визуализации из дампа. Profiler Profiler Commerical (например, MemoryProfiler от Scitech) используют эту технику с годами, но она довольно медленная, когда у вас огромный дамп памяти, так как они используют Windbg в качестве анализатора дампов.

Ответ 5

Вы можете попробовать инструмент Intellitrace, содержащий конечную версию визуальной студии. Это то, что вы описали - оно записывает, что происходит в вашем приложении, и позволяет вам отлаживать его, не выполняя свою программу с зависанием переменных и всех других окон отладки, которые вам помогут.

Ответ 6

Вы можете использовать PostSharp. Мне было очень полезно записывать время отладки из-за развертывания приложения окружения. И инструмент/записал много вещей.

Но, очевидно, вам нужно будет указать все переменные, необходимые для записи.

Подробнее. здесь.