C # Как сбросить все переменные и текущие значения во время выполнения - PullRequest
21 голосов
/ 12 октября 2009

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

Ответы [ 6 ]

7 голосов
/ 12 октября 2009

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

4 голосов
/ 12 октября 2009

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

Выезд:

http://www.dotnetlogging.com/

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

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

2 голосов
/ 13 ноября 2012

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

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

Кодекс выглядит так просто:

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

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

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

1 голос
/ 17 ноября 2012

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

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

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

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

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, вы также можете создать дамп памяти на лету, а затем загрузить дамп памяти из вашего процесса, чтобы извлечь данные объекта для визуализации из дампа. Commeric Memory Profilers (например, MemoryProfiler от Scitech) используют эту технику годами, но она довольно медленная, когда у вас огромный дамп памяти, поскольку они также используют Windbg в качестве анализатора дампов.

0 голосов
/ 14 ноября 2012

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

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

Проверьте подробности здесь .

0 голосов
/ 13 ноября 2012

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

...