In Visual Studio, se si desidera collegare il debugger a qualsiasi processo, è possibile selezionare un motore specifico (tipo di codice) o un insieme di motori che si desidera utilizzare:Informazioni sui motori di debug utilizzati dal debugger
successivo (dopo aver selezionato qualsiasi motori e processi), se si fa clic Allega tasto, il debugger allegare viene avviato il funzionamento. Quindi vengono attivati anche gli eventi relativi al debug. IDebugEventCallback2::Event
può essere utilizzato per grab tali eventi (e ad esempio, estrarre i nomi dei processi debugger è in realtà che si ricollegano a):
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);
//...
}
}
C'è un modo simile a ottenere alcune informazioni sui motori che sono stati scelto?
UPDATE: codice un po 'più dettagliato:
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) { /*...*/ }
}
e l'utilizzo:
var debugger = GetService(typeof(SVsShellDebugger)) as IVsDebugger;
var hunter = new DebugEventsHunter(debugger);
hunter.Start();
difficile capire come ti sei perso il passo successivo, chiamare IDebugProcessCreateEvent2.GetEngine(). Che cosa è andato storto? –
@Hans Passant: Se intendi 'IDebugEngineCreateEvent2 :: GetEngine()' Ho provato a usarlo, ma senza alcun successo. Si prega di controllare la domanda aggiornata per verificare cosa ho fatto in modo errato (btw: sto usando VS2013 questo fa alcuna differenza). – jwaliszko