9

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

1 に答える 1

3

デバッグ エンジンがプロセスを起動するか、既存のプロセスにアタッチするとIDebugLoadCompleteEvent2、タイムリーにイベントが送信されます。このイベントを使用して、デバッグ用に選択されたデバッグ エンジンを正確に判断できます。

編集:デバッグ エンジンの名前を特定するにはIDebugProgram2、上記のイベントに含まれているインスタンスを使用して、IDebugProgram2.GetEngineInfoメソッドを呼び出します。このメソッドは、デバッグ エンジンの名前と ID を提供します。デバッグ エンジンの名前は、デバッガ ダイアログで見慣れているものと一致しない場合があることに注意してください。その場合、独自のマッピング実装を使用して、このメソッドによって返される正規名を「わかりやすい」名前に変換する必要があります。

于 2014-03-26T03:06:24.170 に答える