使用多个引擎将 Visual Studio 2013 附加到托管和 C++ 进程

Posted

技术标签:

【中文标题】使用多个引擎将 Visual Studio 2013 附加到托管和 C++ 进程【英文标题】:Attach Visual Studio 2013 to managed and C++ processes using multiple engines 【发布时间】:2014-01-15 14:38:55 【问题描述】:

我正在尝试让 Visual Studio 2013 以编程方式将调试器附加到子进程,我开始使用 Process.Start 方法。

Process.Start(ProcessStartupInformation startupInfo)

var subProcess = Process.Start(startInfo);

// TODO: how to find the right VS instance?
var dte2 = (EnvDTE80.DTE2)Marshal.GetActiveObject("VisualStudio.DTE.12.0");
var debugger2 = (EnvDTE80.Debugger2)dte2.Debugger;
Process2 processToAttachTo = null;
if (debugger2.LocalProcesses != null)

    foreach (Process2 proc in debugger2.LocalProcesses)
    
        if (proc.ProcessID == subProcess.Id)
        
            processToAttachTo = proc;
        
    
 

 if (processToAttachTo != null)
 
      var trans = debugger2.Transports.Item("Default");
      var engine1 = trans.Engines.Item("Managed (v4.5, v4.0)");
      var engine2 = trans.Engines.Item("Native");
      var engines = new[]  engine1, engine2 ;

      processToAttachTo.Attach2(engines);
  

不幸的是,这似乎使调试器崩溃。但是,如果我只使用其中一个引擎

      processToAttachTo.Attach2(engine1);

      processToAttachTo.Attach2(engine2);

一切正常。

在那种情况下,我只能调试我的 C++ 子进程或我的 C# 子进程。但不是两者兼而有之。

如果我尝试获取processToAttachTo.Transport.Engines 并使用类似processToAttachTo.Attach2(processToAttachTo.Transport.Engines) 的方法,调试器也会崩溃,并且我在调用被被调用者拒绝。 (来自 HRESULT 的异常:0x80010001 (RPC_E_CALL_REJECTED)) 异常。

问题:

    如何使用多个引擎来附加调试器? 如果无法附加多个引擎,我如何确定应该附加哪个引擎?

相关问题:

我见过this question about debugging child processes like WinDBG。我认为这与我无关。 还有this question regarding MessageFilter when attaching to interop processes

更多信息:

http://msdn.microsoft.com/en-us/library/ms228772(v=vs.120).aspx

【问题讨论】:

如果你真正想要的只是同时调试两个进程,你不能简单地使用多个启动项目吗? ***.com/questions/3850019/… 我们想要实现的是拥有一个启动器应用程序,它可以启动其他应用程序。这样,我们在启动器中对用户进行一次身份验证,所有后续应用程序调用都将使用已识别的用户...换句话说,不,我不能使用多个启动项目。 啊哈。但最后你只想调试那些启动的应用程序,对吧?如果是作为一种解决方法(因为我不知道如何解决上述问题),你可以例如向启动的应用程序传递一个额外的参数,如“调试”,并在应用程序看到该参数时发出 DebugBreak。然后你将有机会附加调试器..虽然手动.. 将错误返回值称为“崩溃”有点快。获得“呼叫被拒绝”是很正常的,当您使用命令猛烈抨击 VS 时会发生这种情况。使用 CoRegisterMessageFilter() 是一个严厉的解决方案。或者只是睡一会,然后再试一次。你第一次遇到什么样的“崩溃”是无法猜测的。 我稍微简化了代码。我循环这段代码最多 100 次,或者直到我成功附加调试器。在每个周期中,我都会睡 10 毫秒。是不是太短了? 【参考方案1】:

string[] 为我工作(VS 2017):

processToAttachTo.Attach2(new string[] "Managed (v4.5, v4.0)", "Native");

【讨论】:

什么都比不上接受 5 年后发布的答案,直到今天 ;)

以上是关于使用多个引擎将 Visual Studio 2013 附加到托管和 C++ 进程的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2012 上的计算机错误中缺少 GDAL201.dll

如何将 SQL 报告项目 (rptproj) 升级到 Visual Studio 2012?

为虚幻引擎4设置Visual Studio

Visual Studio单元测试调试

Visual Studio - 引擎盖下(NPM/Typescript)

visual studio2019的安装以及使用