使用 CDB 调试用户模式进程
可以使用 CDB 附加到正在运行的进程或生成并附加到新进程。
附加到正在运行的进程
命令提示符
在命令提示符窗口中,可以在启动 CDB 时附加到正在运行的进程。 使用以下命令之一:
- cdb -p ProcessID
- cdb -pn ProcessName
其中 ProcessID 是正在运行的进程 ID,或者 ProcessName 是正在运行的进程的名称。
有关命令行语法的详细信息,请参阅 CDB 命令行选项。
CDB 命令窗口
如果调试器已经调试了一个或多个进程,则可以使用 .attach(附加到进程) 命令附加到正在运行的进程。
除非某些线程被冻结或挂起,否则调试器始终同时启动多个目标进程。
如果 .attach 命令成功,调试器将在下次调试器发出执行命令时附加到指定的进程。 如果在一行中多次使用此命令,则必须像使用此命令一样多次请求调试器执行。
非侵入性附加到正在运行的进程
如果要调试正在运行的进程,并且只干扰其执行,则应以非侵入方式调试进程。
命令提示符
若要从 CDB 命令行以非侵入方式调试正在运行的进程,请在以下语法中指定 -pv 选项、 -p 选项和进程 ID。
cdb -pv -p ProcessID
或者,若要通过指定进程名称以非侵入性方式调试正在运行的进程,请改用以下语法。
cdb -pv -pn ProcessName
还有其他几个有用的命令行选项。 有关命令行语法的详细信息,请参阅 CDB 命令行选项。
CDB 命令窗口
如果调试器已处于活动状态,则可以通过输入 .attach -v(附加到进程) 命令,以非侵入性地调试正在运行的进程。
如果调试器已经以侵入性的方式调试了一个或多个进程,则可以使用 .attach 命令。
如果 .attach -v 命令成功,调试器将在下次调试器发出执行命令时调试指定的进程。 由于在非侵入性调试期间不允许执行,因此调试器不能一次非侵入性地调试多个进程。 此限制还意味着使用 .attach -v 命令可能会使现有入侵调试会话不那么有用。
生成新进程
CDB 可以启动用户模式应用程序,然后调试应用程序。 应用程序按名称指定。 调试器还可以自动附加到子进程(原始目标进程启动的其他进程)。
调试器创建的进程(也称为生成进程)的行为与调试器不创建的进程的行为略有不同。
调试器创建的进程不使用标准堆 API,而是使用特殊的调试堆。 可以使用_NO_DEBUG_HEAP 环境变量 或 -hd 命令行选项强制生成进程使用标准堆而不是调试堆。
此外,由于目标应用程序是调试器的子进程,因此它将继承调试器的权限。 此权限可能使目标应用程序能够执行无法执行的某些操作。 例如,目标应用程序可能能够影响受保护的进程。
在命令提示符窗口中,可以在启动 CDB 时生成新进程。 输入以下命令。
cdb [-o] ProgramName [Arguments]
-o 选项会导致调试器附加到子进程。 还有其他几个有用的命令行选项。 有关命令行语法的详细信息,请参阅 CDB 命令行选项。
如果调试器已在调试一个或多个进程,可以通过输入 .create (创建进程) 命令来创建新进程。
除非某些线程被冻结或挂起,否则调试器将始终同时启动多个目标进程。
如果 .create 命令成功,调试器将在下次调试器发出执行命令时创建指定的进程。 如果在一行中多次使用此命令,则必须像使用此命令一样多次请求调试器执行。
可以在 .create 之前使用 .createdir (Set Created Process Directory) 命令来控制应用程序的起始目录。 可以使用 .createdir -I 命令或 -noinh 命令行选项来控制目标应用程序是否继承调试器的句柄。
可以使用 .childdbg(调试子进程)命令激活或停用子进程的调试。
重新附加到进程
如果调试器停止响应或冻结,可以将新调试器附加到目标进程。 有关如何在此情况下附加调试器的详细信息,请参阅 重新附加到目标应用程序。