Есть ли способ переключиться в пользовательский режим определенного процесса в дампе ядра во время посмертной отладки?
Я помню, как делал это во время отладки в реальном времени с помощью команды .process.
Есть ли способ переключиться в пользовательский режим определенного процесса в дампе ядра во время посмертной отладки?
Я помню, как делал это во время отладки в реальном времени с помощью команды .process.
.process
также работает в дампах ядра. Во-первых, вы можете найти свой процесс, используя
!process 0 0 myprocess.exe
а затем переключитесь на этот процесс, используя
.process <address>
где ‹address› — шестнадцатеричное число после ПРОЦЕСС.
Обратите внимание, что вы все еще отлаживаете ядро, и у вас есть только физическая память этого процесса (он же рабочий набор). Большая часть виртуального адресного пространства, вероятно, перенесена на диск, и вы не можете анализировать этот процесс, как в пользовательском режиме (особенно для программ .NET, где вам нужна полная куча .NET).
В качестве дополнения к ответу Томаса вы можете использовать .process /p /r . Это установит контекст пользовательского режима и перезагрузит символы пользовательского режима. Это позволит вашим последующим командам потока в этом новом контексте процесса отображать сторону пользовательского режима стека. Вы можете пропустить навигацию по процессу, если знаете свой целевой поток, используя .thread /p /r .
Найти идентификатор процесса
!process 0 0 process.exe
Использование ProcessID для поиска ThreadID
!process <ProcessID>
Переключиться на ветку
.thread /p /r <ThreadID>
У меня есть статья, в которой рассказывается о проблемах, связанных с этим, и о лучших способах сделать это как в сценариях отладки живого дампа, так и в сценариях аварийного дампа:
http://www.osronline.com/article.cfm?id=576