调试多个进程(C#、Visual Basic、C++)

Visual Studio 可以调试具有多个进程的解决方案。 可以在进程之间开始和切换、中断、继续和逐步执行代码、停止调试以及结束或从单个进程分离。

使用多个进程开始调试

当 Visual Studio 解决方案中的多个项目可以独立运行时,可以选择调试器启动的项目。 当前启动项目在 解决方案资源管理器中以粗体显示。

若要更改启动项目,请在 解决方案资源管理器中右键单击其他项目,然后选择“ 设置为启动项目”。

若要从 解决方案资源管理器 开始调试项目而不使其成为启动项目,请右键单击该项目,然后选择 “调试>启动新实例 ”或 “单步执行到新实例”。

若要从解决方案属性设置启动项目或多个项目,请执行以下作:

  1. 解决方案资源管理器 中选择解决方案,然后选择工具栏中的 “属性” 图标,或右键单击解决方案并选择“ 属性”。

  2. “属性 ”页上,选择 “通用属性>启动项目”。

    更改项目DBG_Execution_StartMultipleProjects的启动类型

  3. 选择 “当前选择”、“ 单个启动项目 ”和“项目文件”或 “多个启动项目”。

    如果选择 多个启动项目,可以更改每个项目的启动顺序和作: 启动启动而不调试

  4. 选择 “应用”或 “确定 ”以应用并关闭对话框。

附加到进程

调试器还可以附加到在 Visual Studio 外部运行的进程中的应用程序,包括在远程设备上。 附加到应用后,可以使用 Visual Studio 调试器。 调试功能可能受到限制。 这取决于应用是否是使用调试信息生成的,你是否有权访问应用的源代码,以及 JIT 编译器是否跟踪调试信息。

有关详细信息,请参阅 “附加到正在运行的进程”。

附加到正在运行的进程:

  1. 运行应用后,选择“ 调试>附加到进程”。

    “附加到进程”对话框

  2. 在“ 附加到进程 ”对话框中,从 “可用进程 ”列表中选择进程,然后选择“ 附加”。

注释

即使子项目位于同一解决方案中,调试器也不会自动附加到由调试进程启动的子进程。 若要调试子进程,请在子进程启动后附加到子进程,或将 Windows 注册表编辑器配置为在新调试器实例中启动子进程。

使用注册表编辑器在调试器中自动启动进程

有时,可能需要调试由另一个进程启动的应用的启动代码。 示例包括服务项目和自定义设置作业。 可以让调试器启动并自动附加到应用。

  1. 通过运行 regedit.exe启动 Windows 注册表编辑器。

  2. 在注册表编辑器中,导航到 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options

  3. 选择要在调试器中启动的应用的文件夹。

    如果应用未列为子文件夹,请右键单击 “图像文件执行选项”,选择“ 新建>密钥”,然后键入应用名称。 或者,右键单击树中的新键,选择“ 重命名”,然后输入应用名称。

  4. 右键单击树中的新键,然后选择“ 新建>字符串值”。

  5. 将新值的名称从 New Value #1 更改为 debugger

  6. 右键单击 调试器 并选择“ 修改”。

    “编辑字符串”对话框

  7. “编辑字符串”对话框中,键入vsjitdebugger.exe“值”数据框,然后选择“确定”。

    regedit.exe中的自动调试器启动项

使用多个进程进行调试

使用多个进程调试应用时,默认情况下,中断、单步执行和继续调试器命令会影响所有进程。 例如,当某个进程在断点处暂停时,所有其他进程的执行也会暂停。 可以更改此默认行为,以便更好地控制执行命令的目标。

若要更改在一个进程出错时是否暂停所有进程:

  1. “工具”(或“调试”>选项)窗格中,展开“所有设置>>”部分。
  1. “工具 ”(或 “调试” >选项 )对话框中,展开 “调试>常规 ”部分。
  1. 选中或清除当一个进程中断时中断所有进程选项复选框。

Break、Step、Continue 命令

下表描述了选中或取消选中一个进程中断时中断所有进程复选框时,调试命令的行为:

命令 Selected 已取消选中
调试>全部暂停 所有进程都会中断。 所有进程都会中断。
调试>继续 所有进程都会恢复。 所有挂起的进程都会恢复。
调试>单步进入单步跳过单步退出 所有进程在当前进程执行阶段时运行。
然后,所有进程都会中断。
当前流程步骤。
挂起的进程将恢复。
继续运行进程。
调试>进入当前进程越过当前进程退出当前进程 N/A 当前流程步骤。
其他进程保持其现有状态(已挂起或正在运行)。
源窗口 断点 所有进程都会中断。 仅源窗口进程中断。
源窗口 “运行到游标”
源窗口必须处于当前进程中。
所有进程在源窗口进程运行时一直运行到光标处,然后中断。
然后,所有其他进程都会中断。
源窗口进程运行到游标。
其他进程保持其现有状态(已挂起或正在运行)。
进程 窗口 >中断进程 N/A 选定的进程中断。
其他进程保持其现有状态(已挂起或正在运行)。
“进程 ”窗口 >“继续处理” N/A 所选进程将恢复。
其他进程保持其现有状态(已挂起或正在运行)。

查找源和符号 (.pdb) 文件

若要导航进程的源代码,调试器需要访问其源文件和符号文件。 有关详细信息,请参阅 指定符号 (.pdb) 和源文件

如果无法访问进程文件,则可以使用 反汇编 窗口进行浏览。 有关详细信息,请参阅 如何:使用反汇编窗口

在进程之间切换

调试时,可以附加到多个进程,但在任何给定时间,调试器中只有一个进程处于活动状态。 可以在“调试位置”工具栏或“进程”窗口中设置活动进程或当前进程。 若要在进程之间切换,这两个进程必须处于中断模式。

若要从“调试位置”工具栏设置当前进程,请执行以下作:

  1. 若要打开 “调试位置” 工具栏,请选择“ 查看>工具栏>调试位置”。

  2. 在调试期间,在 “调试位置” 工具栏上,从“ 进程 ”下拉列表中选择要设置为当前进程的进程。

    在进程之间切换

从“进程”窗口设置当前进程:

  1. 若要在调试时打开 “进程 ”窗口,请选择“ 调试>Windows>进程”。

  2. 在“ 进程 ”窗口中,当前进程标有黄色箭头。 双击要设置为当前进程的进程。

    进程窗口

切换到进程会将它设置为当前进程以进行调试。 调试器窗口显示当前进程的状态,单步执行命令仅影响当前进程。

停止使用多个进程进行调试

默认情况下,选择 “调试>停止调试”时,调试器将结束或分离所有进程。

  • 如果在调试器中启动当前进程,则进程将结束。

  • 如果将调试器附加到当前进程,调试器会从进程分离,并使进程保持运行状态。

如果在 Visual Studio 解决方案中开始调试一个进程,然后再附加到另一个已经在运行的进程上,接着选择停止调试,调试会话将结束。 在 Visual Studio 中启动的进程将结束,而附加到的进程将持续运行。

若要控制 停止调试 影响单个进程的方式,请在“ 进程 ”窗口中右键单击某个进程,然后在 调试停止 时选中或清除“分离”复选框。

注释

在一个进程崩溃时,“中断所有进程”调试器选项不会影响停止、终止或与进程分离的操作。

停止、终止和分离命令

下表描述了具有多个进程的调试器停止、终止和分离命令的行为:

命令 说明
调试>停止调试 除非在 “进程 ”窗口中更改了行为,否则调试器启动的进程将结束,并且附加的进程将被分离。
调试>全部终止 所有进程都已结束。
调试>断开所有 调试器从所有进程分离。
“进程 ”窗口 >“分离进程 调试器从所选进程分离。
其他进程保持其现有状态(已挂起或正在运行)。
“进程 ”窗口 >“终止进程 所选进程已结束。
其他进程保持其现有状态(已挂起或正在运行)。
调试停止时>”窗口分离 如果选中, 调试>停止调试 将从所选进程分离。
如果未选中, 调试>停止调试 将结束所选进程。