调试多个目标

可以同时调试多个转储文件或实时用户模式应用程序。 每个目标包含一个或多个进程,每个进程包含一个或多个线程。

这些目标也分组到 系统中。 系统是一组目标,这些目标组合在一起以便于识别和操作。 系统的定义如下:

  • 每个内核模式或用户模式转储文件都是一个单独的系统。

  • 当你在不同的计算机上调试实时用户模式应用程序(通过使用 进程服务器(如 Dbgsrv)时,每个应用程序都是一个单独的系统。

  • 在本地计算机上调试实时用户模式应用程序时,应用程序将组合成单个系统。

当前活动系统是当前正在调试的系统。

获取多个目标

第一个目标以通常的方式获取。

可以使用 .attach(附加到进程)或 .create (创建进程)命令调试其他实时用户模式应用程序,后跟 g (Go) 命令。

可以使用 .opendump (Open Dump File) 命令调试其他转储文件,后跟 g (Go) 命令。 还可以在启动调试器时打开多个转储文件。 若要打开多个转储文件,请在命令中包含多个 -z 开关,每个开关后跟不同的文件名。

即使进程位于不同的系统上,也可以使用上述命令。 必须在每个系统上启动进程服务器,然后将 -premote 参数与 .attach.create 配合使用来标识正确的进程服务器。 如果再次使用 .attach.create 命令而不指定 -premote 参数,则调试器会附加到当前系统上的进程或创建进程。

操作系统和目标

调试开始时,当前系统是调试器最近附加到的系统。 如果发生异常,则当前系统将切换到发生此异常的系统。

若要关闭一个目标并继续调试其他目标,请使用 .kill (Kill Process) 命令。 可以使用 .detach(从进程分离) 命令或 WinDbg 的 调试 |请改为分离 Debuggee 菜单命令。 这些命令将调试器与目标分离,但使目标保持运行状态。

若要控制多个系统的调试,可以使用以下方法:

通过使用这些命令来选择当前系统,并使用标准命令 选择当前进程和线程,可以确定显示内存和寄存器的命令的上下文。

但是,不能单独执行这些进程。 g (Go) 命令始终导致所有目标一起执行。

注意 在一起调试实时目标和转储目标时,存在一些复杂情况,因为对于每种类型的调试,命令的行为方式不同。 例如,如果在当前系统是转储文件时使用 g(执行)命令,调试器将开始执行,但无法中断回调试器,因为中断命令无法识别为对转储文件调试有效。

示例

若要同时处理三个转储文件,可以使用 -z 选项在 WinDbg 启动时加载它们。

windbg -z c:\notepad.dmp -z c:\paint.dmp -z c:\calc.dmp

有关详细信息,请参阅 WinDbg 命令行选项。 还可以使用 .opendump g (Go) 命令在调试器中加载其他转储文件。

使用 ||(系统状态) 用于确认所有三个系统都存在命令。

||0:0:007> ||
.  0 User mini dump: c:\notepad.dmp
   1 User mini dump: C:\paint.dmp
   2 User mini dump: c:\calc.dmp

使用 g (Go) 命令完成转储文件的加载。

||0:0:007> g

************* Path validation summary **************
Response                         Time (ms)     Location
Deferred                                       srv*
Symbol search path is: srv*
Executable search path is: 
Windows 10 Version 15063 MP (4 procs) Free x64
Product: WinNt, suite: SingleUserTS
15063.0.amd64fre.rs2_release.170317-1834
Machine Name:
Debug session time: Fri Jun  9 15:52:04.000 2017 (UTC - 7:00)
System Uptime: not available
Process Uptime: 0 days 0:03:44.000
...............................................................
This dump file has a breakpoint exception stored in it.
The stored exception information can be accessed via .ecxr.
ntdll!DbgBreakPoint:
00007ff8`aada8d70 cc              int     3

然后使用 ||s (设置当前系统) 命令,将当前系统设置为系统 1,然后显示当前系统。

||1:1:017> ||1s
||1:1:017> ||
   0 User mini dump: c:\notepad.dmp
.  1 User mini dump: c:\paint.dmp
   2 User mini dump: c:\calc.dmp

查看当前转储文件时,可以使用 .detach 命令。

||1:1:017> .detach
ntdll!DbgBreakPoint:
00007ff8`aada8d70 cc              int     3
Detached
||0:0:007> ||
.  0 User mini dump: c:\notepad.dmp
   2 User mini dump: c:\calc.dmp

资源

有关调试的其他信息,请参阅以下资源。

书籍

  • 《高级 Windows 调试》,作者:Mario Hewardt 和 Daniel Pravat

  • 在 Windows 调试中:Tarik Soulami 在 Windows 中调试和跟踪策略的实用指南

  • 由帕维尔·约西夫维奇、亚历克斯·伊恩斯库、马克·鲁西诺维奇和大卫·所罗门的 Windows 内部

视频

碎片整理工具秀 WinDbg 第 13-29 集:</shows/defrag-tools/>