Для этого вы можете использовать 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 в качестве анализатора дампов.