Debugging Tools for Windows

非侵入式调试(用户模式)

如果用户模式应用程序正在运行,调试器可以非侵入式的调试它。在非侵入式调试下,调试动作会少一些。但是,可以将调试器对目标程序的影响降到最低。

在非侵入式调试下,调试器实际上并没有附加到目标程序。调试器暂停目标的所有线程并访问它的内存、注册表和其他信息。但是,调试器不能控制目标,所以类似g (Go) 这样的命令都不能工作。

如果在非侵入式调试时试图执行不允许的命令,会收到这样的错误信息: "The debugger is not attached, so process execution cannot be monitored."

结束调试会话时,调试器释放目标程序,并且目标程序继续运行。可以使用q (Quit), .detach (Detach from Process)或者WinDbg的 Debug | Detach DebuggeeDebug | Stop Debugging命令来关闭会话。 (如果通过关闭调试器窗口,或者使用WinDbg的File菜单的Exit命令,目标进程一般会停止响应。)

如果当目标程序运行在Windows 2000下,并且希望结束会话时不结束它,非侵入式调试是很有用的。(这些系统上如果调试器附加到了目标就不能再取消附加。) 非侵入式调试在当目标程序停止相应并且不能打开附加时需要的中断线程时也很有用。

选择要调试的进程

可以通过进程ID(PID)或进程名来指定目标程序。

如果用名字指定程序,则会要使用进程包含扩展名在内的的完整名字。如果两个进程有相同的名字,则必须使用进程ID。

关于如何找到进程ID和进程名,查看获得进程

下小节描述了进行非侵入式调试的几种方法,以不同的开始位置进行分类。

CDB 命令提示符

使用CDB命令提示符对运行中进程进行非侵入式调试,用如下语法使用-pv-p 选项和进程ID。

cdb -pv -p ProcessID 

或者按照如下语法用进程名指定。

cdb -pv -pn ProcessName 

还有一些其它有用的命令行选项。关于命令行语法的更多信息,查看CDB命令行选项

WinDbg 命令提示符

使用WinDbg命令提示符对运行中进程进行非侵入式调试,用如下语法使用-pv -p 选项和进程ID。

windbg -pv -p ProcessID 

或者按照如下语法用进程名指定

windbg -pv -pn ProcessName 

还有一些其它有用的命令行选项。关于命令行语法的更多信息,查看WinDbg命令行选项

WinDbg 菜单

当WinDbg在静止模式时,可以点击File菜单的Attach to a Process 或者按F6来对运行中进程进行非侵入式调试。

Attach to Process 对话框出现时,选中Noninvasive 选择框。然后选中包含目标进程ID和名字的一行。(也可以在Process ID文本框自己输入进程ID)。最后,点击OK

调试器命令窗口

如果调试器已经激活,可以使用调试器命令窗口输入.attach -v (Attach to Process)命令进行非侵入式调试。

可以在调试器已经在对一个或多个进程进行侵入式调试的情况下使用.attach 命令。也可以在CDB静止的时候使用,但是不能在WinDbg静止时使用。

如果.attach -v 命令成功,调试器会在自己执行下一条命令时开始调试指定进程。因为非侵入式调试不允许被调试进程执行,所以一次只能对一个进程进行非侵入式调试。这也意味着.attach -v 命令可能使得已存在的其他侵入式调试会话受到限制。

开始调试会话

关于如何开始调试会话的更多信息,查看调试器配置符号 调试器操作(常规)调试器操作(用户模式)

Build machine: CAPEBUILD