} // end constructor public static DbgPseudoRegisterInfo GetDbgPsedoRegisterInfo(DbgEngDebugger debugger, string name) { return(debugger.ExecuteOnDbgEngThread(() => { WDebugRegisters dr = (WDebugRegisters)debugger.DebuggerInterface; uint idx; StaticCheckHr(dr.GetPseudoIndexByNameWide(name, out idx)); string tmpName; ulong typeMod; uint typeId; StaticCheckHr(dr.GetPseudoDescriptionWide(idx, out tmpName, out typeMod, out typeId)); DEBUG_VALUE[] dvs; StaticCheckHr(dr.GetPseudoValues(DEBUG_REGSRC.FRAME, 1, // count idx, // start out dvs)); return new DbgPseudoRegisterInfo(debugger, tmpName, dvs[0], typeMod, typeId, DEBUG_ANY_ID); })); } // end factory
} // end constructor public static DbgRegisterInfo GetDbgRegisterInfoForIndex(DbgEngDebugger debugger, uint registerIndex) { return(debugger.ExecuteOnDbgEngThread(() => { WDebugRegisters dr = (WDebugRegisters)debugger.DebuggerInterface; DEBUG_REGISTER_DESCRIPTION desc; string name; StaticCheckHr(dr.GetDescriptionWide(registerIndex, out name, out desc)); // Don't use dr.GetValue, because it won't respect the context. DEBUG_VALUE[] dvs; StaticCheckHr(dr.GetValues2(DEBUG_REGSRC.FRAME, new uint[] { registerIndex }, out dvs)); return new DbgRegisterInfo(debugger, name, dvs[0], desc, registerIndex); })); } // end factory
protected DbgRegisterSetBase(DbgEngDebugger debugger, DbgStackFrameInfo stackFrame, DbgRegisterSetBase baseline) : base(debugger) { if (null == stackFrame) { throw new ArgumentNullException("stackFrame"); } StackFrame = stackFrame; Debugger.ExecuteOnDbgEngThread(() => { m_debugSymbols = (WDebugSymbols)Debugger.DebuggerInterface; m_debugRegisters = (WDebugRegisters)Debugger.DebuggerInterface; m_debugControl = (WDebugControl)Debugger.DebuggerInterface; }); Baseline = baseline; // We used to lazily retrieve values, but that's no good when the context // changes (such as when stepping through code). _GetRegisterInfo(); } // end constructor