调试多个目标
可以同时调试多个转储文件或实时用户模式应用程序。 每个目标包含一个或多个进程,每个进程包含一个或多个线程。
这些目标也分组到 系统中。 系统是一组目标,这些目标组合在一起以便于识别和操作。 系统的定义如下:
每个内核模式或用户模式转储文件都是一个单独的系统。
当你在不同的计算机上调试实时用户模式应用程序(通过使用 进程服务器(如 Dbgsrv)时,每个应用程序都是一个单独的系统。
在本地计算机上调试实时用户模式应用程序时,应用程序将组合成单个系统。
当前或活动系统是当前正在调试的系统。
获取多个目标
第一个目标以通常的方式获取。
可以使用 .attach(附加到进程)或 .create (创建进程)命令调试其他实时用户模式应用程序,后跟 g (Go) 命令。
可以使用 .opendump (Open Dump File) 命令调试其他转储文件,后跟 g (Go) 命令。 还可以在启动调试器时打开多个转储文件。 若要打开多个转储文件,请在命令中包含多个 -z 开关,每个开关后跟不同的文件名。
即使进程位于不同的系统上,也可以使用上述命令。 必须在每个系统上启动进程服务器,然后将 -premote 参数与 .attach 或 .create 配合使用来标识正确的进程服务器。 如果再次使用 .attach 或 .create 命令而不指定 -premote 参数,则调试器会附加到当前系统上的进程或创建进程。
操作系统和目标
调试开始时,当前系统是调试器最近附加到的系统。 如果发生异常,则当前系统将切换到发生此异常的系统。
若要关闭一个目标并继续调试其他目标,请使用 .kill (Kill Process) 命令。 可以使用 .detach(从进程分离) 命令或 WinDbg 的 调试 |请改为分离 Debuggee 菜单命令。 这些命令将调试器与目标分离,但使目标保持运行状态。
若要控制多个系统的调试,可以使用以下方法:
| |(系统状态) 命令显示有关一个或多个系统的信息
| |s (设置当前系统) 命令使你能够选择当前系统
(仅限 WinDbg)“ 进程和线程”窗口 使你能够显示或选择系统、进程和线程
通过使用这些命令来选择当前系统,并使用标准命令 选择当前进程和线程,可以确定显示内存和寄存器的命令的上下文。
但是,不能单独执行这些进程。 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/>