W Visual Studio, jeśli chcesz dołączyć debugger do dowolnych procesów, masz możliwość wyboru określonego silnika (typu kodu) lub zestawu silników, których chcesz użyć:Informacje o mechanizmach debugowania używanych przez debugger
Następny (po wybraniu dowolnych silników i procesów), jeśli klikniesz attach przycisk, debugger dołączyć operacja została uruchomiona. Następnie uruchamiane są również zdarzenia związane z debugowaniem. IDebugEventCallback2::Event
mogą być wykorzystane do grab takich zdarzeń (i na przykład wyodrębnić nazwy procesów debugger jest faktycznie przypadających na):
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);
//...
}
}
Czy istnieje podobny sposób, aby uzyskać pewne informacje o silników, które zostały wybrany?
UPDATE: nieco bardziej szczegółowy kod:
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) { /*...*/ }
}
i użytkowanie:
var debugger = GetService(typeof(SVsShellDebugger)) as IVsDebugger;
var hunter = new DebugEventsHunter(debugger);
hunter.Start();
Trudno zobaczyć, jak przeoczyłeś następny krok, wywołaj IDebugProcessCreateEvent2.GetEngine(). Co poszło nie tak? –
@Hans Passant: Jeśli masz na myśli 'IDebugEngineCreateEvent2 :: GetEngine()' Próbowałem go użyć, ale bez powodzenia. Sprawdź zaktualizowane pytanie, aby sprawdzić, co zrobiłem niepoprawnie (btw: Używam VS2013 to robi różnicę). – jwaliszko