2013-04-16 14 views
9

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

enter image description here

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

Trudno zobaczyć, jak przeoczyłeś następny krok, wywołaj IDebugProcessCreateEvent2.GetEngine(). Co poszło nie tak? –

+0

@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

Odpowiedz

2

Gdy silnik debugowania uruchamia proces lub dołącza do istniejącego procesu, to wysłać IDebugLoadCompleteEvent2 wydarzenie w odpowiednim czasie. Możesz użyć tego zdarzenia, aby dokładnie określić, które silniki debugowania zostały wybrane do debugowania.

Edit: Aby określić nazwę silnika debugowania, można użyć instancji IDebugProgram2, który znajduje się w powyższym przypadku, i wywołać metodę IDebugProgram2.GetEngineInfo. Ta metoda udostępnia nazwę i identyfikator mechanizmu debugowania. Zauważ, że nazwa mechanizmu debugowania może nie być zgodna z tym, co widzisz w oknach dialogowych debuggera. W takim przypadku musisz przekonwertować nazwę kanoniczną zwróconą przez tę metodę na "przyjazną" nazwę, używając własnej implementacji mapowania.

+0

Rzeczywiście, ze względu na fakt, że kilka różnych zdarzeń debugowania jest uruchamianych, w funkcji 'Event' mogę obejrzeć parametr' debugEvent' i czekać, kiedy będzie to typ 'IDebugLoadCompleteEvent2'. Zdarza się. Ale jeśli złapię to wydarzenie (tak jak zabrałem "IDebugProcessCreateEvent2"), jak uzyskać informacje o silnikach? – jwaliszko

+0

Myślałem, że pytasz o to, które silniki są podłączone? Tylko włączone silniki debugujące wysyłają to zdarzenie. –

+0

Mój problem polega na tym, że piszę małą wtyczkę VS i potrzebuję 2 informacji: jakie są nazwy procesów, które wybraliśmy, i jakie są nazwy wybranych przez nas typów kodu. Jeśli dołączysz do jakiejkolwiek wtyczki procesu, tylko czeka na zdarzenie "IDebugProcessCreateEvent2", wyodrębnia nazwę procesu (jak pokazano w pytaniu) i zapisuje ją w pliku (aby później użyć). Niestety nie mam pojęcia, jak uzyskać te typy kodu, które zostały wybrane do debugowania. – jwaliszko

Powiązane problemy