2013-04-16 2 views
9

В Visual Studio, если вы хотите присоединить отладчик к любым процессам, у вас есть возможность выбрать какой-либо конкретный движок (тип кода) или набор двигателей, которые вы хотели бы использовать:Информация об устройствах отладки, используемых отладчиком

enter image description here

Следующая (после того, как вы выбрали какие двигатели и процессы), если вы нажмете приложить кнопку, отладчик присоединять запускается операция. Затем также запускаются события, связанные с отладкой. IDebugEventCallback2::Event может быть использован для grab таких событий (и, например, извлечь имена процессов отладчика фактически приходящиеся):

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); 
     //... 
    } 
} 

Есть ли подобный способ получить некоторую информацию о двигателях, которые были выбрали?

UPDATE: немного более подробный код:

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) { /*...*/ } 
} 

и использование:

var debugger = GetService(typeof(SVsShellDebugger)) as IVsDebugger; 
var hunter = new DebugEventsHunter(debugger); 
hunter.Start(); 
+0

Трудно видеть, как вы пропустили следующий шаг, вызовите IDebugProcessCreateEvent2.GetEngine(). Что пошло не так? –

+0

@Hans Passant: Если вы имеете в виду 'IDebugEngineCreateEvent2 :: GetEngine()' Я пытался использовать его, но без каких-либо успехов. Проверьте обновленный вопрос, чтобы проверить, что я сделал неправильно (кстати, я использую VS2013, это имеет значение). – jwaliszko

ответ

2

Когда отладочный двигатель запускает процесс или присоединяется к существующему процессу, он пошлет IDebugLoadCompleteEvent2 Событие своевременно. Вы можете использовать это событие, чтобы точно определить, какие отладочные механизмы были выбраны для отладки.

Edit: Чтобы определить имя отладки двигателя, вы можете использовать IDebugProgram2 экземпляр, который входит в состав данного мероприятия, и вызвать метод IDebugProgram2.GetEngineInfo. Этот метод предоставляет имя и идентификатор отладочного движка. Обратите внимание, что имя механизма отладки может не соответствовать тому, что вы использовали для просмотра в диалоговом окне отладчика, и в этом случае вам нужно будет преобразовать каноническое имя, возвращаемое этим методом, в «дружественное» имя, используя собственную реализацию сопоставления.

+0

Действительно, из-за того, что запущена группа различных событий отладки, внутри функции «Событие» я могу посмотреть параметр 'debugEvent' и ждать, когда он будет иметь тип IDebugLoadCompleteEvent2. Бывает. Но если я поймаю это событие (точно так же, как я поймал 'IDebugProcessCreateEvent2'), как получить информацию о двигателях? – jwaliszko

+0

Я думал, вы спрашиваете, какие двигатели прилагаются? Только отладочные двигатели, которые приложили, отправляют это событие. –

+0

Моя проблема заключается в том, что я пишу небольшой плагин VS, и мне нужна 2 информации: какие имена процессов мы выбрали для присоединения, и каковы имена выбранных типов кода. Если вы подключаетесь к любому плагину процесса, просто ждет событие IDebugProcessCreateEvent2', извлекает имя процесса (как показано в вопросе) и сохраняет его в файле (для последующего использования). К сожалению, я понятия не имею, как получить эти типы кода, которые были выбраны для отладки. – jwaliszko

Смежные вопросы