2013-04-16 8 views
9

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

enter image description here

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

difficile capire come ti sei perso il passo successivo, chiamare IDebugProcessCreateEvent2.GetEngine(). Che cosa è andato storto? –

+0

@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

risposta

2

Quando un motore di debug avvia un processo o si attacca ad un processo esistente, invierà la IDebugLoadCompleteEvent2 evento in modo tempestivo. È possibile utilizzare questo evento per determinare esattamente quali motori di debug sono stati selezionati per il debug.

Edit: Per determinare il nome del motore di debug, è possibile utilizzare l'istanza IDebugProgram2 che è incluso con l'evento di cui sopra, e chiamare il metodo IDebugProgram2.GetEngineInfo. Questo metodo fornisce il nome e l'ID del motore di debug. Si noti che il nome del motore di debug potrebbe non corrispondere a quello che si è abituati a vedere nelle finestre di dialogo del debugger, nel qual caso sarà necessario convertire il nome canonico restituito da questo metodo in un nome "amichevole" utilizzando la propria implementazione di mappatura.

+0

Infatti, a causa del fatto che un gruppo di vari eventi di debug sono licenziato, all'interno del 'Event' funzione posso guardare il parametro' debugEvent', e aspettare quando sarà di 'tipo IDebugLoadCompleteEvent2'. Succede. Ma se catturo questo evento (proprio come ho visto 'IDebugProcessCreateEvent2'), come ottenere informazioni sui motori? – jwaliszko

+0

Ho pensato che stavi chiedendo su quali motori sono collegati? Solo i motori di debug che sono stati collegati inviano quell'evento. –

+0

Il mio problema è che sto scrivendo un piccolo plug-in VS e ho bisogno di 2 informazioni: quali sono i nomi dei processi che abbiamo selezionato per essere allegati e quali sono i nomi dei tipi di codice che abbiamo scelto. Se si allega a qualsiasi plug-in di processo, si attende solo l'evento 'IDebugProcessCreateEvent2', estrae il nome del processo (come mostrato in una domanda) e lo memorizza in un file (da utilizzare in seguito). Sfortunatamente non ho idea di come ottenere questo tipo di codice, che è stato scelto per il debug. – jwaliszko