有没有办法在进行事后调试时切换到内核转储中特定进程的用户模式?
我记得在使用 .process 命令进行实时调试时这样做。
.process
也适用于内核转储。首先,您可以使用
!process 0 0 myprocess.exe
然后使用切换到该过程
.process <address>
其中<address>是PROCESS之后的十六进制数。
请注意,您仍在进行内核调试,并且只有该进程的物理内存可用(又名工作集)。大多数虚拟地址空间可能已交换到磁盘,并且您无法像在用户模式下那样分析该进程(尤其是对于需要完整 .NET 堆的 .NET 程序)。
作为 Thomas 回应的后续行动,您可以使用 .process /p /r 。这将设置您的用户模式上下文并重新加载用户模式符号。这将使您在这个新进程上下文中的后续线程命令能够显示堆栈的用户模式端。如果您使用 .thread /p /r 知道目标线程,则可以跳过进程导航。
查找进程 ID
!process 0 0 process.exe
使用 ProcessID 查找 ThreadID
!process <ProcessID>
切换到线程
.thread /p /r <ThreadID>
我有一篇文章讨论了与此相关的问题以及在实时和故障转储调试场景中执行此操作的最佳方法: