Visual Studio 可以调试具有多个进程的解决方案。 可以在进程之间开始和切换、中断、继续和逐步执行代码、停止调试以及结束或从单个进程分离。
使用多个进程开始调试
当 Visual Studio 解决方案中的多个项目可以独立运行时,可以选择调试器启动的项目。 当前启动项目在 解决方案资源管理器中以粗体显示。
若要更改启动项目,请在 解决方案资源管理器中右键单击其他项目,然后选择“ 设置为启动项目”。
若要从 解决方案资源管理器 开始调试项目而不使其成为启动项目,请右键单击该项目,然后选择 “调试>启动新实例 ”或 “单步执行到新实例”。
若要从解决方案属性设置启动项目或多个项目,请执行以下作:
在 解决方案资源管理器 中选择解决方案,然后选择工具栏中的 “属性” 图标,或右键单击解决方案并选择“ 属性”。
在 “属性 ”页上,选择 “通用属性>启动项目”。
选择 “当前选择”、“ 单个启动项目 ”和“项目文件”或 “多个启动项目”。
如果选择 多个启动项目,可以更改每个项目的启动顺序和作: 启动、 启动而不调试或 无。
选择 “应用”或 “确定 ”以应用并关闭对话框。
附加到进程
调试器还可以附加到在 Visual Studio 外部运行的进程中的应用程序,包括在远程设备上。 附加到应用后,可以使用 Visual Studio 调试器。 调试功能可能受到限制。 这取决于应用是否是使用调试信息生成的,你是否有权访问应用的源代码,以及 JIT 编译器是否跟踪调试信息。
有关详细信息,请参阅 “附加到正在运行的进程”。
附加到正在运行的进程:
运行应用后,选择“ 调试>附加到进程”。
在“ 附加到进程 ”对话框中,从 “可用进程 ”列表中选择进程,然后选择“ 附加”。
注释
即使子项目位于同一解决方案中,调试器也不会自动附加到由调试进程启动的子进程。 若要调试子进程,请在子进程启动后附加到子进程,或将 Windows 注册表编辑器配置为在新调试器实例中启动子进程。
使用注册表编辑器在调试器中自动启动进程
有时,可能需要调试由另一个进程启动的应用的启动代码。 示例包括服务项目和自定义设置作业。 可以让调试器启动并自动附加到应用。
通过运行 regedit.exe启动 Windows 注册表编辑器。
在注册表编辑器中,导航到 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options。
选择要在调试器中启动的应用的文件夹。
如果应用未列为子文件夹,请右键单击 “图像文件执行选项”,选择“ 新建>密钥”,然后键入应用名称。 或者,右键单击树中的新键,选择“ 重命名”,然后输入应用名称。
右键单击树中的新键,然后选择“ 新建>字符串值”。
将新值的名称从 New Value #1 更改为
debugger。右键单击 调试器 并选择“ 修改”。
在“编辑字符串”对话框中,键入
vsjitdebugger.exe“值”数据框,然后选择“确定”。
使用多个进程进行调试
使用多个进程调试应用时,默认情况下,中断、单步执行和继续调试器命令会影响所有进程。 例如,当某个进程在断点处暂停时,所有其他进程的执行也会暂停。 可以更改此默认行为,以便更好地控制执行命令的目标。
若要更改在一个进程出错时是否暂停所有进程:
- 在“工具”(或“调试”>选项)窗格中,展开“所有设置>>”部分。
- 在 “工具 ”(或 “调试” >选项 )对话框中,展开 “调试>常规 ”部分。
- 选中或清除当一个进程中断时中断所有进程选项复选框。
Break、Step、Continue 命令
下表描述了选中或取消选中一个进程中断时中断所有进程复选框时,调试命令的行为:
| 命令 | Selected | 已取消选中 |
|---|---|---|
| 调试>全部暂停 | 所有进程都会中断。 | 所有进程都会中断。 |
| 调试>继续 | 所有进程都会恢复。 | 所有挂起的进程都会恢复。 |
| 调试>单步进入、单步跳过或单步退出 | 所有进程在当前进程执行阶段时运行。 然后,所有进程都会中断。 |
当前流程步骤。 挂起的进程将恢复。 继续运行进程。 |
| 调试>进入当前进程、 越过当前进程或 退出当前进程 | N/A | 当前流程步骤。 其他进程保持其现有状态(已挂起或正在运行)。 |
| 源窗口 断点 | 所有进程都会中断。 | 仅源窗口进程中断。 |
| 源窗口 “运行到游标” 源窗口必须处于当前进程中。 |
所有进程在源窗口进程运行时一直运行到光标处,然后中断。 然后,所有其他进程都会中断。 |
源窗口进程运行到游标。 其他进程保持其现有状态(已挂起或正在运行)。 |
| 进程 窗口 >中断进程 | N/A | 选定的进程中断。 其他进程保持其现有状态(已挂起或正在运行)。 |
| “进程 ”窗口 >“继续处理” | N/A | 所选进程将恢复。 其他进程保持其现有状态(已挂起或正在运行)。 |
查找源和符号 (.pdb) 文件
若要导航进程的源代码,调试器需要访问其源文件和符号文件。 有关详细信息,请参阅 指定符号 (.pdb) 和源文件。
如果无法访问进程文件,则可以使用 反汇编 窗口进行浏览。 有关详细信息,请参阅 如何:使用反汇编窗口。
在进程之间切换
调试时,可以附加到多个进程,但在任何给定时间,调试器中只有一个进程处于活动状态。 可以在“调试位置”工具栏或“进程”窗口中设置活动进程或当前进程。 若要在进程之间切换,这两个进程必须处于中断模式。
若要从“调试位置”工具栏设置当前进程,请执行以下作:
若要打开 “调试位置” 工具栏,请选择“ 查看>工具栏>调试位置”。
在调试期间,在 “调试位置” 工具栏上,从“ 进程 ”下拉列表中选择要设置为当前进程的进程。
从“进程”窗口设置当前进程:
若要在调试时打开 “进程 ”窗口,请选择“ 调试>Windows>进程”。
在“ 进程 ”窗口中,当前进程标有黄色箭头。 双击要设置为当前进程的进程。
切换到进程会将它设置为当前进程以进行调试。 调试器窗口显示当前进程的状态,单步执行命令仅影响当前进程。
停止使用多个进程进行调试
默认情况下,选择 “调试>停止调试”时,调试器将结束或分离所有进程。
如果在调试器中启动当前进程,则进程将结束。
如果将调试器附加到当前进程,调试器会从进程分离,并使进程保持运行状态。
如果在 Visual Studio 解决方案中开始调试一个进程,然后再附加到另一个已经在运行的进程上,接着选择停止调试,调试会话将结束。 在 Visual Studio 中启动的进程将结束,而附加到的进程将持续运行。
若要控制 停止调试 影响单个进程的方式,请在“ 进程 ”窗口中右键单击某个进程,然后在 调试停止 时选中或清除“分离”复选框。
注释
在一个进程崩溃时,“中断所有进程”调试器选项不会影响停止、终止或与进程分离的操作。
停止、终止和分离命令
下表描述了具有多个进程的调试器停止、终止和分离命令的行为:
| 命令 | 说明 |
|---|---|
| 调试>停止调试 | 除非在 “进程 ”窗口中更改了行为,否则调试器启动的进程将结束,并且附加的进程将被分离。 |
| 调试>全部终止 | 所有进程都已结束。 |
| 调试>断开所有 | 调试器从所有进程分离。 |
| “进程 ”窗口 >“分离进程 | 调试器从所选进程分离。 其他进程保持其现有状态(已挂起或正在运行)。 |
| “进程 ”窗口 >“终止进程 | 所选进程已结束。 其他进程保持其现有状态(已挂起或正在运行)。 |
| 调试停止时>”窗口分离 | 如果选中, 调试>停止调试 将从所选进程分离。 如果未选中, 调试>停止调试 将结束所选进程。 |