在Visual Studio中,如果您想要将调试器附加到任何进程上,则可以选择一些特定的引擎(代码类型)或一组您希望使用的引擎:
在你选择任何引擎和进程之后,如果你点击Attach按钮,调试器附加操作就会开始。然后也会触发调试相关的事件。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();
IDebugEngineCreateEvent2::GetEngine()
,我已经尝试使用它,但没有成功。请检查更新后的问题以验证我做错了什么(顺便说一句:我正在使用VS2013,如果有任何区别,请告诉我)。 - jwaliszko