我试图让 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
最佳答案
string[]
适合我(VS 2017):
processToAttachTo.Attach2(new string[] {"Managed (v4.5, v4.0)", "Native"});
关于c# - 使用多个引擎将 Visual Studio 2013 附加到托管和 C++ 进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21140303/