Debugging 将托管调试器附加到C代码中的.NET核心子进程
我有一个.NETCore2.0C程序,它启动另一个.NETCore2.0C程序。我希望在子进程启动时或在其执行的某个点自动将VS 2017调试器附加到该子进程 我尝试添加一个Debugging 将托管调试器附加到C代码中的.NET核心子进程,debugging,visual-studio-2017,.net-core,mixed-mode,vsjitdebugger,Debugging,Visual Studio 2017,.net Core,Mixed Mode,Vsjitdebugger,我有一个.NETCore2.0C程序,它启动另一个.NETCore2.0C程序。我希望在子进程启动时或在其执行的某个点自动将VS 2017调试器附加到该子进程 我尝试添加一个System.Diagnostics.Debugger.Launch调用子进程代码,这确实会弹出VS JIT Debugger对话框,但是: 如果我没有选中“手动选择调试引擎”,它只调试本机代码。正如预期的那样,进程在断点处停止,但我无法调试我的C#代码 如果我选中它并选中“托管”,我仍然无法取消选中“本机”-它说“调试器
System.Diagnostics.Debugger.Launch
调用子进程代码,这确实会弹出VS JIT Debugger对话框,但是:
- 如果我没有选中“手动选择调试引擎”,它只调试本机代码。正如预期的那样,进程在断点处停止,但我无法调试我的C#代码
- 如果我选中它并选中“托管”,我仍然无法取消选中“本机”-它说“调试器要处理当前异常,必须选择“本机”代码。”然后它启动混合模式调试,但不进入中断模式。如果我手动中断,我可以看到调用Debugger.Launch的线程具有以下堆栈跟踪:
如何连接调试器,以便在断点处停止,检查托管变量,然后继续?Debug.Assert可能是最简单的方法,如果它们拥有第二个进程。假设这在.NETCore中可用 您可以在此处查看有关其调试器运行的原因的详细信息。Launch的运行方式如下:
您是否在工具->选项->调试JIT下选择相关的程序类型:托管、本机或脚本?或者像这样定制JSON文件:是的,我选中了“托管”。我实际上不想调试本机代码,但正如我所说,“本机”是选中的,不能被取消选中。这个问题呢?请您与我们分享最新信息好吗?@jackzai MSFT我想我不理解您链接的GitHub问题的相关性。它谈到了启用本机调试,但我不希望这样。我想调试托管代码(仅)。只需忽略上面的注释,我之前添加了一个答案,并尝试了它,它所做的操作与问题中所述的
System.Diagnostics.Debugger.Launch
完全相同。@EM0,debug.Assert应该会显示一个对话框。然后可以附加任何需要的调试器。在附加调试器之前,您不会单击“重试”按钮。不,正如我的问题所述,我不能附加任何我想要的调试器。“本机”已选中,不能取消选中。
ntdll.dll!ZwWaitForMultipleObjects()
KernelBase.dll!WaitForMultipleObjectsEx()
kernel32.dll!WaitForMultipleObjectsExImplementation()
[Managed to Native Transition]
(my method that called System.Diagnostics.Debugger.Launch)