В Visual Studio, если вы хотите присоединить отладчик к любым процессам, у вас есть возможность выбрать какой-либо конкретный движок (тип кода) или набор двигателей, которые вы хотели бы использовать:Информация об устройствах отладки, используемых отладчиком
Следующая (после того, как вы выбрали какие двигатели и процессы), если вы нажмете приложить кнопку, отладчик присоединять запускается операция. Затем также запускаются события, связанные с отладкой. IDebugEventCallback2::Event
может быть использован для grab таких событий (и, например, извлечь имена процессов отладчика фактически приходящиеся):
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);
//...
}
}
Есть ли подобный способ получить некоторую информацию о двигателях, которые были выбрали?
UPDATE: немного более подробный код:
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();
Трудно видеть, как вы пропустили следующий шаг, вызовите IDebugProcessCreateEvent2.GetEngine(). Что пошло не так? –
@Hans Passant: Если вы имеете в виду 'IDebugEngineCreateEvent2 :: GetEngine()' Я пытался использовать его, но без каких-либо успехов. Проверьте обновленный вопрос, чтобы проверить, что я сделал неправильно (кстати, я использую VS2013, это имеет значение). – jwaliszko