Информация об отладочных механизмах, используемых отладчиком

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

введите здесь описание изображения

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

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

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

ОБНОВЛЕНИЕ: немного более подробный код:

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

person jwaliszko    schedule 16.04.2013    source источник
comment
Трудно понять, как вы пропустили следующий шаг, вызовите IDebugProcessCreateEvent2.GetEngine(). Что пошло не так?   -  person Hans Passant    schedule 23.03.2014
comment
@Hans Passant: Если вы имеете в виду IDebugEngineCreateEvent2::GetEngine(), я пытался его использовать, но безуспешно. Пожалуйста, проверьте обновленный вопрос, чтобы проверить, что я сделал неправильно (кстати: я использую VS2013, это не имеет значения).   -  person jwaliszko    schedule 24.03.2014


Ответы (1)


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

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

person Sam Harwell    schedule 26.03.2014
comment
Ведь из-за того, что запускается куча разных отладочных событий, внутри функции Event я могу смотреть параметр debugEvent и ждать, когда он будет типа IDebugLoadCompleteEvent2. Такое случается. Но если я поймаю это событие (так же, как я поймал IDebugProcessCreateEvent2), как тогда получить информацию о двигателях? - person jwaliszko; 26.03.2014
comment
Я думал, вы спрашивали о том, какие двигатели прикреплены? Только механизмы отладки, которые присоединились, отправляют это событие. - person Sam Harwell; 26.03.2014
comment
Моя проблема в том, что я пишу небольшой плагин VS, и мне нужно 2 информации: каковы имена процессов, которые мы выбрали для присоединения, и каковы имена выбранных нами типов кода. Если вы подключаетесь к какому-либо плагину процесса, он просто ждет события IDebugProcessCreateEvent2, извлекает имя процесса (как показано в вопросе) и сохраняет его в файле (для последующего использования). К сожалению, я понятия не имею, как получить эти типы кода, которые были выбраны для отладки. - person jwaliszko; 26.03.2014
comment
Я хотел бы, чтобы они хранились в том же файле, что и имена процессов. Мне это нужно, потому что этот плагин позже может повторно подключиться к этим процессам, к которым мы были подключены ранее (используя их имена, сохраненные в файле). Недостаток в том, что мой плагин всегда подключается с использованием managed движка: var engines = new[] { transport.Engines.Item("managed") }; process.Attach2(engines). Было бы очень полезно, если бы я мог повторно подключиться, используя именно эти типы кода (движки), которые использовались раньше. - person jwaliszko; 26.03.2014
comment
@JaroslawWaliszko Я отредактировал свой пост; если вам нужна дополнительная информация, вам нужно более четко определить, точно какая информация вам нужна. - person Sam Harwell; 26.03.2014
comment
Извините, но я все еще не понимаю. Вы отметили, что можете использовать это событие, чтобы точно определить, какие механизмы отладки были выбраны для отладки, но как? Мне нужно имя, например Native или Managed или Managed/Native и т. д. Глядя на приведенный выше код, не могли бы вы сказать мне, как реализовать логику, позволяющую получить имя движка? - person jwaliszko; 26.03.2014
comment
@JaroslawWaliszko Я отредактировал свой пост, включив в него информацию о получении имя прикрепленного механизма отладки. - person Sam Harwell; 26.03.2014
comment
Спасибо. Вы сэкономили мне много времени, что я очень ценю. - person jwaliszko; 26.03.2014