Debugging 将托管调试器附加到C代码中的.NET核心子进程

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#代码 如果我选中它并选中“托管”,我仍然无法取消选中“本机”-它说“调试器

我有一个.NETCore2.0C程序,它启动另一个.NETCore2.0C程序。我希望在子进程启动时或在其执行的某个点自动将VS 2017调试器附加到该子进程

我尝试添加一个
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)