如果用户模式应用程序已经在运行,调试器可以非侵入性地对其进行调试。对于非侵入性调试,您没有那么多的调试操作。但是,您可以最小化调试器对目标应用程序的干扰。如果目标应用程序已停止响应,则非侵入性调试非常有用。
在非侵入性调试中,调试器实际上并不附加到目标应用程序。调试器挂起目标的所有线程,并可以访问目标的内存、寄存器和其他此类信息。但是,调试器无法控制目标,因此g(Go)等命令不起作用。
如果尝试执行非侵入性调试期间不允许的命令,则会收到一条错误消息,指出“The debugger is not attached, so process execution cannot be monitored.(未附加调试器,因此无法监视进程执行。)”
选择要调试的进程
您可以通过进程ID(PID)或进程名指定目标应用程序。如果按名称指定应用程序,则应使用进程的完整名称,包括文件扩展名。如果两个进程具有相同的名称,则必须改用进程ID。
通过WinDbg命令行
要从WinDbg命令行无创地调试正在运行的进程,请使用以下语法指定-pv选项、-p选项和进程ID。
windbg -pv -p ProcessID
或者,要通过指定进程名来无创地调试正在运行的进程,请改用以下语法。
windbg -pv -pn ProcessName
通过WinDbg菜单
当WinDbg处于休眠模式时,通过单击“文件”菜单上的“附加到进程”或按F6键,可以无创地调试正在运行的进程。 出现“附加到进程”对话框时,选中“非侵入性”复选框。然后,选择包含所需进程ID和名称的行。(也可以在“进程ID”框中输入进程ID。)最后,单击“确定”。
通过调试器命令窗口
如果调试器已处于活动状态,则可以使用“调试器命令”窗口中的.attach-v(attach to process)命令无创地调试正在运行的进程。
如果调试器已经在侵入性地调试一个或多个进程,则可以使用.attach命令。 如果此命令处于休眠状态,则可以在CDB中使用,但不能在处于休眠状态的WinDbg中使用。如果.attach-v命令成功,调试器将在下次调试器发出执行命令时调试指定的进程。由于在非侵入性调试期间不允许执行,因此调试器不能一次非侵入性调试多个进程。这个限制也意味着使用.attach-v命令可能会使现有的入侵调试会话变得不那么有用。