Выполнение procdump из приложения для создания дампа самого приложения

Я пытаюсь заставить свое приложение (VB.NET скомпилировано на платформе.NET 4.0) написать свой дамп процесса, чтобы помочь мне с отладкой. Для этого я использую Procdump от Sysinternals.

Чтобы начать, я просто выполняю следующий код для события клика (поэтому в стеке вызовов должно быть что-то узнаваемое):

Dim p As New Process
p.StartInfo.FileName = "C:\procdump.exe"
p.StartInfo.Arguments = "-accepteula -ma " & Process.GetCurrentProcess.Id
p.Start()
p.WaitForExit()
p.Dispose()       ' Breakpoint

На последней строке также точка останова.

Чтобы создать дамп, я запускаю приложение в режиме отладки в VS 2010, нажимаю кнопку, чтобы заставить этот код выполняться, и когда он достигает точки останова, я знаю, что дамп был записан. На этом этапе я также создаю другой файл дампа, используя Visual Studio (Debug -> Save Dump As..).

В результате у меня остаются два файла дампа примерно одинакового размера (400 с лишним МБ), один из которых создан Procdump.exe, а другой - Visual Studio. Не касаясь какого-либо кода, который был создан, я теперь открываю оба файла дампа (с открытым кодом, нажимаю Ctrl+O) и указываю папку вывода отладки в опции папки символов.

Теперь, когда я нажимаю "Отладка со смешанным" в дампе, созданном Visual Studio, я получаю стек вызовов (в главном потоке) с распознаваемыми именами методов, и отладчик хорошо позиционирует его в позиции в исходном коде, где точка останова было.

Однако, когда я нажимаю "Отладка со смешанным" в дампе, созданном Procdump, стек вызовов (основного потока) содержит только такие вещи, как clr.dll!6cb34e46(), KERNELBASE.dll!75106a8e() с ntdll.dll!76f07094() вверху. Нет узнаваемого кода, а также ничего актуального в часах.

Это почему? На самом деле, я ожидал, что эти два дампа будут почти равны (только на несколько строк кода). [Имеет отношение к присоединенному отладчику, см. Редактирование ниже.]

Обратите внимание, что символы были правильно загружены в обоих случаях. Списки, которые я получаю в Debug->Windows->Modules, показывают одинаковые символы для загрузки для обоих дампов. Более того, если я переключаюсь на фоновый поток в обоих дампах, я получаю правильный стек вызовов для них (со значениями их переменных и т. Д.) В обоих дампах.

РЕДАКТИРОВАТЬ

Я заметил, что, выполняя приложение без подключенного отладчика, я получаю ожидаемый дамп процесса (т. Е. Равный тому, который был захвачен Visual Studio, но выключен одной строкой). Задача решена. Но мне все еще интересно, почему я не получил этот результат с подключенным отладчиком.

1 ответ

Сам по себе procdump является отладчиком. То, что вы делаете, - это просите его сбросить процесс, который уже отлажен, и, следовательно, файл дампа различий.

Другие вопросы по тегам