В Visual Studio, если вы хотите прикрепить отладчик к каким-либо процессам, у вас есть возможность выбрать конкретный движок (тип кода) или набор движков, которые вы хотели бы использовать:
Далее (после того, как вы выбрали любые механизмы и процессы), если вы нажмете кнопку Присоединить, запустится операция присоединения отладчика. Затем также запускаются события, связанные с отладкой. IDebugEventCallback2::Event
можно использовать для захвата таких событий (и, например, извлечения имен к которому на самом деле подключен отладчик процессов):
public int Event(IDebugEngine2 engine, IDebugProcess2 process, IDebugProgram2 program,
IDebugThread2 thread, IDebugEvent2 debugEvent, ref Guid riidEvent,
uint attributes)
{
if (debugEvent is IDebugProcessCreateEvent2)
{
string processname;
if(process != null)
process.GetName((uint) enum_GETNAME_TYPE.GN_FILENAME, out processname);
//...
}
}
Есть ли аналогичный способ получить информацию о выбранных двигателях?
ОБНОВЛЕНИЕ: немного более подробный код:
public class DebugEventsHunter : IVsDebuggerEvents, IDebugEventCallback2
{
private readonly IVsDebugger _debugger;
private uint _cookie;
public DebugEventsHunter(IVsDebugger debugger) { _debugger = debugger; }
public void Start()
{
_debugger.AdviseDebuggerEvents(this, out _cookie);
_debugger.AdviseDebugEventCallback(this);
}
public int Event(IDebugEngine2 engine, IDebugProcess2 process, IDebugProgram2 program,
IDebugThread2 thread, IDebugEvent2 debugEvent, ref Guid riidEvent, uint attributes)
{
if (debugEvent is IDebugProcessCreateEvent2)
{
// get process name (shown before)
}
if (debugEvent is IDebugEngineCreateEvent2)
{
// why execution flow never enters this scope?
IDebugEngine2 e;
((IDebugEngineCreateEvent2)debugEvent).GetEngine(out e);
}
// engine parameter is also always null within this scope
return VSConstants.S_OK;
}
public int OnModeChange(DBGMODE mode) { /*...*/ }
}
и использование:
var debugger = GetService(typeof(SVsShellDebugger)) as IVsDebugger;
var hunter = new DebugEventsHunter(debugger);
hunter.Start();
IDebugEngineCreateEvent2::GetEngine()
, я пытался его использовать, но безуспешно. Пожалуйста, проверьте обновленный вопрос, чтобы проверить, что я сделал неправильно (кстати: я использую VS2013, это не имеет значения). - person jwaliszko   schedule 24.03.2014