Wenn Sie in Visual Studio Debugger an beliebige Prozesse anfügen möchten, haben Sie die Möglichkeit, eine bestimmte Engine (Codetyp) oder einen Satz von Engines auszuwählen:Informationen zum Debuggen von Engines, die vom Debugger verwendet werden
Next (nachdem Sie alle Motoren und Prozesse ausgewählt), wenn Sie Schaltfläche Attach klicken, wird der Debugger anhängen Vorgang gestartet wird. Dann werden auch Debug-bezogene Ereignisse ausgelöst. IDebugEventCallback2::Event
kann grab solche Ereignisse verwendet werden (und zB extrahieren die Namen der Prozesse Debugger tatsächlich angefügt wird):
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);
//...
}
}
Gibt es eine ähnliche Art und Weise einige Informationen über die Motoren, die waren zu bekommen gewählt?
UPDATE: etwas ausführlichere Code:
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) { /*...*/ }
}
und die Nutzung:
var debugger = GetService(typeof(SVsShellDebugger)) as IVsDebugger;
var hunter = new DebugEventsHunter(debugger);
hunter.Start();
Schwer zu sehen, wie Sie den nächsten Schritt verpasst haben, rufen Sie IDebugProcessCreateEvent2.GetEngine(). Was schief gelaufen ist? –
@Hans Passant: Wenn Sie 'IDebugEngineCreateEvent2 :: GetEngine()' Ich habe versucht, es zu verwenden, aber ohne Erfolg. Bitte überprüfen Sie die aktualisierte Frage, um zu überprüfen, was ich falsch gemacht habe (übrigens: Ich benutze VS2013 es macht keinen Unterschied). – jwaliszko