Существуют ли какие-либо встроенные или сторонние библиотеки, которые позволяют вам просто сбрасывать все переменные в память во время выполнения? Я хотел бы иметь возможность просматривать переменные и текущие значения аналогично их просмотру, нажимая точку останова и зависая над переменными, но без фактической остановки выполнения программы (т.е. просто получения снимка). Было бы хорошо, если бы он мог выгружать их в файл, который затем можно было бы открыть позже в программе, чтобы получить хороший графический интерфейс для их просмотра, но простого дампа текстового файла было бы достаточно.
C# Как сбросить все переменные и текущие значения во время выполнения
- Я думаю, что этот вопрос очень общий и стал бы частью супер-отладчика, если бы существовал ответ, поэтому я открыл для него награду. Представьте, если бы список переменных можно было фильтровать на лету, а также отображать использование памяти (можно мечтать). 11.11.2012
- Нет, я имел в виду «супер», потому что это было бы лучше, чем то, что мы на самом деле имеем в настоящее время с C #. 11.11.2012
- Это совершенно просто сделать в Linux, почему это совершенно невозможно в Windows? 10.03.2017
Ответы:
Я не могу придумать простой способ сделать это в общем виде. Что может сработать, так это программно создать файл дампа вашего запущенного процесса. Вы можете сделать это с помощью P/Invoke для dbghelp.dll или создать процесс cdb.exe для создания файл дампа. Получив файл, вы можете открыть его в отладчике для последующего анализа с помощью SOS. .dll с помощью cdb.exe/windbg.exe или даже написать скрипт отладчика для создания дампа данные, которые вы хотите (в основном) автоматически.
Я считаю, что какая-то структура ведения журнала поможет вам сделать это...
Проверить:
https://www.dotnetlogging.com/
На моем рабочем месте мы используем log4net, который нам очень подходит.
Так почему же вы хотите выгрузить все переменные для последующего анализа? Думали ли вы о том, чтобы сначала написать тест кода, чтобы снизить зависимость от отладчика и иметь набор автоматических тестов, проверяющих значения для вас?
Раньше я использовал профайлер YourKit .Net для профилирования приложений .Net.
Хотя я когда-либо использовал его только для личного подключения к работающим приложениям, документация по моментальным снимкам заявляет, что у них есть Profiler API, который можно использовать для программно создавать снэпшоты для последующего просмотра.
С точки зрения кода это выглядит так же просто, как следующее:
Controller c = new Controller();
String snapshotPath = c.CaptureSnapshot();
Я считаю, что вы можете позже загрузить файлы моментальных снимков в графический интерфейс YourKit, чтобы просмотреть их.
Я не удивлюсь, если некоторые другие популярные профилировщики, такие как JetBrains dotTrace Performance и RedGates ANTS Performance Profiler имеют похожие программные API, но мне не удалось быстро найти очевидная документация на их веб-сайтах (и я не хотел смотреть их вебинары, чтобы узнать, существует ли эта функция!)
Для этого вы можете использовать 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, вы также можете создавать дамп памяти на лету, а затем загружать дамп памяти из вашего процесса, чтобы извлечь данные объекта для визуализации из дампа. Коммерческие профилировщики памяти (например, MemoryProfiler от Scitech) используют эту технику уже много лет, но она довольно медленная, когда у вас огромный дамп памяти, поскольку они также используют Windbg в качестве анализатора дампа.
Вы можете попробовать инструмент Intellitrace, поставляемый с окончательной версией Visual Studio. Это то, что вы описываете - оно записывает то, что происходит в вашем приложении, и позволяет вам отлаживать его, не выполняя вашу программу с наведением курсора на переменные и всеми другими окнами отладки, чтобы помочь вам.