2013-04-16 14 views
9

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

enter image description here

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(); 
+0

Schwer zu sehen, wie Sie den nächsten Schritt verpasst haben, rufen Sie IDebugProcessCreateEvent2.GetEngine(). Was schief gelaufen ist? –

+0

@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

Antwort

2

Wenn ein Debug Engine einen Prozess oder legt zu einem bestehenden Prozess startet, sendet es die IDebugLoadCompleteEvent2 Ereignis rechtzeitig. Mit diesem Ereignis können Sie genau bestimmen, welche Debug-Engines zum Debuggen ausgewählt wurden.

Edit: den Namen des Debug Engine Um zu ermitteln, können Sie die IDebugProgram2 Instanz verwenden, die mit dem obigen Fall enthalten ist, und rufen Sie die IDebugProgram2.GetEngineInfo Methode. Diese Methode enthält den Namen und die ID der Debug-Engine. Beachten Sie, dass der Name der Debug-Engine möglicherweise nicht mit dem übereinstimmt, was Sie in den Debugger-Dialogen sehen. In diesem Fall müssen Sie den von dieser Methode zurückgegebenen kanonischen Namen mithilfe einer eigenen Mapping-Implementierung in einen "freundlichen" Namen konvertieren.

+0

In der Tat, aufgrund der Tatsache, dass eine Reihe von verschiedenen Debug-Ereignisse ausgelöst werden, kann ich innerhalb der 'Event' -Funktion den' debugEvent' Parameter beobachten und warten, wenn es vom 'IDebugLoadCompleteEvent2' Typ sein wird. Es passiert. Aber wenn ich dieses Ereignis (genau wie ich 'IDebugProcessCreateEvent2' gefangen habe) erwische, wie bekomme ich dann Informationen über die Engines? – jwaliszko

+0

Ich dachte, du fragst nach welchen Motoren? Nur Debug-Engines, die sich angemeldet haben, senden dieses Ereignis. –

+0

Mein Problem ist, ich schreibe kleine VS-Plugin und ich brauche 2 Informationen: Was sind die Namen der Prozesse, die wir ausgewählt haben, um anzuhängen, und was sind die Namen der Code-Typen, die wir gewählt haben. Wenn Sie an ein Prozess-Plug-in anhängen, wird nur auf das Ereignis "IDebugProcessCreateEvent2" gewartet, der Prozessname wird extrahiert (wie in einer Frage gezeigt) und in einer Datei gespeichert (später verwendet). Leider habe ich keine Ahnung, wie man diese Codetypen bekommt, die zum Debuggen ausgewählt wurden. – jwaliszko