使用 WinDbg 调试用户模式进程

可以使用 WinDbg 附加到正在运行的进程或生成并附加到新进程。

附加到正在运行的进程

可通过多种方式使用 WinDbg 附加到正在运行的进程。 无论选择哪种方法,都需要进程 ID 或进程名称。 进程 ID 是操作系统分配的数字。 有关如何确定进程 ID 和进程名称的详细信息,请参阅 查找进程 ID

WinDbg 菜单

当 WinDbg 处于休眠模式时,可以通过从“文件”菜单中选择“附加到进程”或按 F6 来附加到正在运行的进程。

在“ 附加到进程 ”对话框中,选择要调试的进程,然后选择“ 确定”。

命令提示符

在命令提示符窗口中,可以在启动 WinDbg 时附加到正在运行的进程。 使用以下命令之一:

  • windbg -pProcessID
  • windbg -pnProcessName

其中 ProcessID 是正在运行的进程 ID,或 ProcessName 是正在运行的进程的名称。

有关命令行语法的详细信息,请参阅 WinDbg Command-Line选项

调试器命令窗口

如果 WinDbg 已调试一个或多个进程,则可以使用调试器命令窗口中的 .attach (附加到 Process) 命令附加到正在运行的进程。

除非某些线程被冻结或挂起,否则调试器始终同时启动多个目标进程。

如果 .attach 命令成功,调试器下次发出执行命令时会附加到指定的进程。 如果在一行中多次使用此命令,则必须像使用此命令一样多次请求调试程序执行。

非侵入性附加到正在运行的进程

如果要调试正在运行的进程,并且只干扰其执行,则应 以非侵入性方式调试进程。

WinDbg 菜单

当 WinDbg 处于休眠模式时,可以通过从“文件”菜单或按 F6 选择“附加到进程”来非侵入性地调试正在运行的进程。

出现 “附加到进程 ”对话框时,选中 “非侵入性 ”复选框。 然后,选择包含所需进程 ID 和名称的行。 (还可以在 “进程 ID ”框中输入进程 ID。) 最后,选择“ 确定”。

命令提示符

在命令提示符窗口中,启动 WinDbg 时,可以非侵入性地附加到正在运行的进程。 使用以下命令之一:

windbg -pv -pProcessIDwindbg -pv -pnProcessName 还有其他几个有用的命令行选项。 有关命令行语法的详细信息,请参阅 WinDbg Command-Line选项

调试器命令窗口

如果调试器已处于活动状态,则可以使用调试器命令窗口中的 .attach -v (Attach to Process) 命令,以非侵入性方式调试正在运行的进程。

如果调试器已在侵入性调试一个或多个进程,则可以使用 .attach 命令。 如果 WinDbg 处于休眠状态,则不能使用此命令。

如果 .attach -v 命令成功,调试程序下次发出执行命令时调试指定的进程。 由于在非侵入性调试期间不允许执行,因此调试器不能一次不侵入性地调试多个进程。 此限制还意味着使用 .attach -v 命令可能会使现有的侵入性调试会话不太有用。

生成新进程

WinDbg 可以启动用户模式应用程序,然后调试应用程序。 应用程序按名称指定。 调试器还可以自动附加到子进程, (原始目标进程启动的其他进程) 。

调试器创建的进程 (也称为生成进程,) 的行为与调试器不创建的进程略有不同。

调试器创建的进程使用特殊的调试堆,而不是使用标准堆 API。 可以使用_NO_DEBUG_HEAP 环境变量-hd 命令行选项强制生成进程使用标准堆而不是调试堆。

此外,由于目标应用程序是调试器的子进程,因此它会继承调试器的权限。 此权限可能使目标应用程序能够执行无法执行的某些操作。 例如,目标应用程序可能会影响受保护的进程。

WinDbg 菜单

当 WinDbg 处于休眠模式时,可以通过从“文件”菜单中选择“打开可执行文件”或按 Ctrl+E 生成新进程。

出现“打开可执行文件”对话框时,在“ 文件名 ”框中输入可执行文件的完整路径,或使用 “查找列表 ”选择所需的路径和文件名。

如果要将任何命令行参数用于用户模式应用程序,请在 “参数 ”框中输入它们。 如果要从默认目录更改起始目录,请在 “开始 ”目录框中输入目录路径。 如果希望 WinDbg 附加到子进程,请 选中“调试子进程”复选框

选择后,选择“ 打开”。

命令提示符

在命令提示符窗口中,可以在启动 WinDbg 时生成新进程。 请使用以下命令:

windbg [-o]ProgramName[Arguments]

-o 选项会导致调试器附加到子进程。 还有其他几个有用的命令行选项。 有关命令行语法的详细信息,请参阅 WinDbg Command-Line选项

调试器命令窗口

如果 WinDbg 已在调试一个或多个进程,则可以在调试器命令窗口中使用 .create (Create Process) 命令创建新进程。

除非某些线程被冻结或挂起,否则调试器将始终同时启动多个目标进程。

如果 .create 命令成功,调试器将在下次调试器发出执行命令时创建指定的进程。 如果在一行中多次使用此命令,则必须像使用此命令一样多次请求调试程序执行。

可以在 .create 之前使用 .createdir (Set Created Process Directory) 命令来控制应用程序的起始目录 可以使用 .createdir -I 命令或 -noinh 命令行选项来控制目标应用程序是否继承调试器的句柄。

可以使用 .childdbg (调试子进程) 命令来激活或停用子进程的调试。

重新附加到进程

如果调试器停止响应或冻结,可以将新调试器附加到目标进程。 有关如何在此情况下附加调试器的详细信息,请参阅 重新附加到目标应用程序