int IDebugThread2.EnumFrameInfo(enum_FRAMEINFO_FLAGS dwFieldSpec, uint nRadix, out IEnumDebugFrameInfo2 ppEnum) { ThrowIfDisposed(); var fi = new FRAMEINFO[1]; var fis = _stackFrames.Value.Select(f => { var frame = (IDebugStackFrame2)new AD7StackFrame(Engine, f); Marshal.ThrowExceptionForHR(frame.GetInfo(dwFieldSpec, nRadix, fi)); return fi[0]; }).ToArray(); ppEnum = new AD7FrameInfoEnum(fis); return VSConstants.S_OK; }
// Retrieves a list of the stack frames for this thread. // We currently call into the process and get the frames. We might want to cache the frame info. int IDebugThread2.EnumFrameInfo(enum_FRAMEINFO_FLAGS dwFieldSpec, uint nRadix, out IEnumDebugFrameInfo2 enumObject) { var stackFrames = _debuggedThread.Frames; if (stackFrames == null) { enumObject = null; return VSConstants.E_FAIL; } int numStackFrames = stackFrames.Count; var frameInfoArray = new FRAMEINFO[numStackFrames]; for (int i = 0; i < numStackFrames; i++) { var frame = new AD7StackFrame(_engine, this, stackFrames[i]); frame.SetFrameInfo(dwFieldSpec, out frameInfoArray[i]); } enumObject = new AD7FrameInfoEnum(frameInfoArray); return VSConstants.S_OK; }
// Retrieves a list of the stack frames for this thread. // We currently call into the process and get the frames. We might want to cache the frame info. int IDebugThread2.EnumFrameInfo(enum_FRAMEINFO_FLAGS dwFieldSpec, uint nRadix, out IEnumDebugFrameInfo2 enumObject) { var stackFrames = _debuggedThread.Frames; if (stackFrames == null) { enumObject = null; return(VSConstants.E_FAIL); } int numStackFrames = stackFrames.Count; FRAMEINFO[] frameInfoArray = new FRAMEINFO[numStackFrames]; for (int i = 0; i < numStackFrames; i++) { AD7StackFrame frame = new AD7StackFrame(_engine, this, stackFrames[i]); frame.SetFrameInfo(dwFieldSpec, out frameInfoArray[i]); } enumObject = new AD7FrameInfoEnum(frameInfoArray); return(VSConstants.S_OK); }
public int EnumFrameInfo(enum_FRAMEINFO_FLAGS dwFieldSpec, uint nRadix, out IEnumDebugFrameInfo2 ppEnum) { FRAMEINFO[] frameInfoArray = new FRAMEINFO[FrameCount]; // Only top frame if(FrameCount == 1) { AD7StackFrame frame = new AD7StackFrame(m_engine, this); frame.SetFrameInfo(dwFieldSpec, 0, out frameInfoArray[0]); } else { for(int i =0; i<FrameCount;i++) { AD7StackFrame frame = new AD7StackFrame(m_engine, this); // stackframe[] frame.SetFrameInfo(dwFieldSpec, i, out frameInfoArray[i]); } } ppEnum = new AD7FrameInfoEnum(frameInfoArray); return VSConstants.S_OK; }
// Retrieves a list of the stack frames for this thread. // For the sample engine, enumerating the stack frames requires walking the callstack in the debuggee for this thread // and coverting that to an implementation of IEnumDebugFrameInfo2. // Real engines will most likely want to cache this information to avoid recomputing it each time it is asked for, // and or construct it on demand instead of walking the entire stack. int IDebugThread2.EnumFrameInfo(enum_FRAMEINFO_FLAGS dwFieldSpec, uint nRadix, out IEnumDebugFrameInfo2 enumObject) { enumObject = null; try { // get the thread's stack frames System.Collections.Generic.List<ThreadContext> stackFrames = null; _engine.DebuggedProcess.WorkerThread.RunOperation(async () => stackFrames = await _engine.DebuggedProcess.ThreadCache.StackFrames(_debuggedThread)); int numStackFrames = stackFrames != null ? stackFrames.Count : 0; FRAMEINFO[] frameInfoArray; if (numStackFrames == 0) { // failed to walk any frames. Return an empty stack. frameInfoArray = new FRAMEINFO[0]; } else { uint low = stackFrames[0].Level; uint high = stackFrames[stackFrames.Count - 1].Level; FilterUnknownFrames(stackFrames); numStackFrames = stackFrames.Count; frameInfoArray = new FRAMEINFO[numStackFrames]; List<ArgumentList> parameters = null; if ((dwFieldSpec & enum_FRAMEINFO_FLAGS.FIF_FUNCNAME_ARGS) != 0) { _engine.DebuggedProcess.WorkerThread.RunOperation(async () => parameters = await _engine.DebuggedProcess.GetParameterInfoOnly(this, (dwFieldSpec & enum_FRAMEINFO_FLAGS.FIF_FUNCNAME_ARGS_VALUES) != 0, (dwFieldSpec & enum_FRAMEINFO_FLAGS.FIF_FUNCNAME_ARGS_TYPES) != 0, low, high)); } for (int i = 0; i < numStackFrames; i++) { var p = parameters != null ? parameters.Find((ArgumentList t) => t.Item1 == stackFrames[i].Level) : null; AD7StackFrame frame = new AD7StackFrame(_engine, this, stackFrames[i]); frame.SetFrameInfo(dwFieldSpec, out frameInfoArray[i], p != null ? p.Item2 : null); } } enumObject = new AD7FrameInfoEnum(frameInfoArray); return Constants.S_OK; } catch (MIException e) { return e.HResult; } catch (Exception e) { return EngineUtils.UnexpectedException(e); } }
int IDebugThread2.EnumFrameInfo(enum_FRAMEINFO_FLAGS dwFieldSpec, uint nRadix, out IEnumDebugFrameInfo2 ppEnum) { // Query the stack depth inquiring GDB. // int numStackFrames = _engine.eDispatcher.getStackDepth(); if (this._id == "") { ppEnum = null; return Constants.S_FALSE; } if (this._engine.evaluatedTheseFlags(this._id, dwFieldSpec)) { ppEnum = new AD7FrameInfoEnum(previousFrameInfoArray); return Constants.S_OK; } // Ask for general stack information. if ((this._id != "") && (this._id != this._engine.currentThread()._id)) _engine.eDispatcher.selectThread(this._id); string stackResponse = _engine.eDispatcher.getStackFrames().Replace("#;;;;", ""); if (stackResponse == "") { ppEnum = null; return Constants.S_FALSE; } string[] frameStrings = stackResponse.Split('#'); // Query the stack depth without inquiring GDB. int numStackFrames = frameStrings.Length; if (numStackFrames > 30) // limiting the amount of stackFrames to avoid VS crashing. numStackFrames = 30; ppEnum = null; try { bool created = false; FRAMEINFO[] frameInfoArray = new FRAMEINFO[numStackFrames]; for (int i = 0; i < numStackFrames; i++) { string[] frameInfo = frameStrings[i].Split(';'); if (frameInfo.Length >= 3) { if (frameInfo[3].Contains("~")) { // Need to lengthen the path used by Visual Studio. StringBuilder longPathName = new StringBuilder(1024); GetLongPathName(frameInfo[3], longPathName, longPathName.Capacity); frameInfo[3] = longPathName.ToString(); } AD7StackFrame frame = AD7StackFrame.create(_engine, this, frameInfo, ref created); if (frame.m_thread.__stackFrames == null) // that's weird, but sometimes VS is not initializing __stackFrames, so I added this loop to avoid other problems. { while (frame.m_thread.__stackFrames == null) frame.m_thread.__stackFrames = new ArrayList() { frame }; // frame.m_thread.__stackFrames.Add(frame); } // if ((_filename != "") || (created == true)) frame.SetFrameInfo(dwFieldSpec, out frameInfoArray[i]); } } // Ignoring when _filename is null to avoid duplicate entries in Call Stack Window. // if ((_filename == "") && (created == false)) // { // ppEnum = null; // if (this._id != "") // _engine.eDispatcher.selectThread(this._engine.currentThread()._id); // return Constants.S_FALSE; // } if ((previousFrameInfoArray.Length != frameInfoArray.Length) || (created == true)) { previousFrameInfoArray = frameInfoArray; ppEnum = new AD7FrameInfoEnum(frameInfoArray); } else { bool isEqual = true; for (int i = 0; i < frameInfoArray.Length; i++) { if (frameInfoArray[i].m_bstrFuncName != previousFrameInfoArray[i].m_bstrFuncName) { isEqual = false; break; } if (frameInfoArray[i].m_dwValidFields != previousFrameInfoArray[i].m_dwValidFields) { isEqual = false; break; } if (frameInfoArray[i].m_bstrLanguage != previousFrameInfoArray[i].m_bstrLanguage) { isEqual = false; break; } } if (!isEqual) { previousFrameInfoArray = frameInfoArray; ppEnum = new AD7FrameInfoEnum(frameInfoArray); } else { ppEnum = new AD7FrameInfoEnum(previousFrameInfoArray); } } // GDBParser.parseCommand("-stack-select-frame 0", 17); if ((this._id != "") && (this._id != this._engine.currentThread()._id)) _engine.eDispatcher.selectThread(this._engine.currentThread()._id); return Constants.S_OK; } catch (ComponentException e) { if ((this._id != "") && (this._id != this._engine.currentThread()._id)) _engine.eDispatcher.selectThread(this._engine.currentThread()._id); return e.HResult; } catch (Exception e) { if ((this._id != "") && (this._id != this._engine.currentThread()._id)) _engine.eDispatcher.selectThread(this._engine.currentThread()._id); return EngineUtils.UnexpectedException(e); } }
public int EnumFrameInfo(enum_FRAMEINFO_FLAGS dwFieldSpec, uint nRadix, out IEnumDebugFrameInfo2 ppEnum) { StackFrame[] stackFrames = ThreadMirror.GetFrames(); ppEnum = new AD7FrameInfoEnum(stackFrames.Select(x => new AD7StackFrame(_engine, this, x).GetFrameInfo(dwFieldSpec)).ToArray()); return(VSConstants.S_OK); }
public int EnumFrameInfo(enum_FRAMEINFO_FLAGS dwFieldSpec, uint nRadix, out IEnumDebugFrameInfo2 ppEnum) { StackFrame[] stackFrames = ThreadMirror.GetFrames(); ppEnum = new AD7FrameInfoEnum(stackFrames.Select(x => new AD7StackFrame(_engine, this, x).GetFrameInfo(dwFieldSpec)).ToArray()); return VSConstants.S_OK; }
// Retrieves a list of the stack frames for this thread. // For the sample engine, enumerating the stack frames requires walking the callstack in the debuggee for this thread // and coverting that to an implementation of IEnumDebugFrameInfo2. // Real engines will most likely want to cache this information to avoid recomputing it each time it is asked for, // and or construct it on demand instead of walking the entire stack. int IDebugThread2.EnumFrameInfo(enum_FRAMEINFO_FLAGS dwFieldSpec, uint nRadix, out IEnumDebugFrameInfo2 enumObject) { // Ask the lower-level to perform a stack walk on this thread m_engine.DebuggedProcess.DoStackWalk(this.m_debuggedThread); enumObject = null; try { System.Collections.Generic.List<X86ThreadContext> stackFrames = this.m_debuggedThread.StackFrames; int numStackFrames = stackFrames.Count; FRAMEINFO[] frameInfoArray; if (numStackFrames == 0) { // failed to walk any frames. Only return the top frame. frameInfoArray = new FRAMEINFO[1]; AD7StackFrame frame = new AD7StackFrame(m_engine, this, GetThreadContext()); frame.SetFrameInfo(dwFieldSpec, out frameInfoArray[0]); } else { frameInfoArray = new FRAMEINFO[numStackFrames]; for (int i = 0; i < numStackFrames; i++) { AD7StackFrame frame = new AD7StackFrame(m_engine, this, stackFrames[i]); frame.SetFrameInfo(dwFieldSpec, out frameInfoArray[i]); } } enumObject = new AD7FrameInfoEnum(frameInfoArray); return Constants.S_OK; } catch (ComponentException e) { return e.HResult; } catch (Exception e) { return EngineUtils.UnexpectedException(e); } }
// Retrieves a list of the stack frames for this thread. // For the sample engine, enumerating the stack frames requires walking the callstack in the debuggee for this thread // and coverting that to an implementation of IEnumDebugFrameInfo2. // Real engines will most likely want to cache this information to avoid recomputing it each time it is asked for, // and or construct it on demand instead of walking the entire stack. int IDebugThread2.EnumFrameInfo(enum_FRAMEINFO_FLAGS dwFieldSpec, uint nRadix, out IEnumDebugFrameInfo2 enumObject) { // Ask the lower-level to perform a stack walk on this thread m_engine.DebuggedProcess.DoStackWalk(this.m_debuggedThread); enumObject = null; try { enumObject = new AD7FrameInfoEnum(m_debuggedThread.StackFrames .Select(f => new AD7StackFrame(m_engine, this, f).GetFrameInfo(dwFieldSpec)) .ToArray()); return Constants.S_OK; } catch (Exception e) { return EngineUtils.UnexpectedException(e); } }
/// <summary> /// Retrieves a list of the stack frames for this thread. (http://msdn.microsoft.com/en-ca/library/bb145138.aspx) /// </summary> /// <param name="dwFieldSpec"> A combination of flags from the FRAMEINFO_FLAGS enumeration that specifies which fields of the /// FRAMEINFO structures are to be filled out. </param> /// <param name="nRadix"> Radix used in formatting numerical information in the enumerator. </param> /// <param name="ppEnum"> Returns an IEnumDebugFrameInfo2 object that contains a list of FRAMEINFO structures describing the /// stack frame. </param> /// <returns> If successful, returns S_OK; otherwise, returns an error code. </returns> int IDebugThread2.EnumFrameInfo(enum_FRAMEINFO_FLAGS dwFieldSpec, uint nRadix, out IEnumDebugFrameInfo2 ppEnum) { if (this._id == "") { ppEnum = null; return Constants.S_FALSE; } if (this._engine.evaluatedTheseFlags(this._id, dwFieldSpec)) { ppEnum = new AD7FrameInfoEnum(previousFrameInfoArray); return Constants.S_OK; } // Ask for general stack information. if ((this._id != "") && (this._id != this._engine.currentThread()._id)) _engine.eDispatcher.selectThread(this._id); string stackResponse = _engine.eDispatcher.getStackFrames().Replace("#;;;;", ""); if (stackResponse == "") { ppEnum = null; return Constants.S_FALSE; } string[] frameStrings = stackResponse.Split('#'); // Query the stack depth without inquiring GDB. int numStackFrames = frameStrings.Length; if (numStackFrames > 30) // limiting the amount of stackFrames to avoid VS crashing. numStackFrames = 30; ppEnum = null; try { bool created = false; FRAMEINFO[] frameInfoArray = new FRAMEINFO[numStackFrames]; for (int i = 0; i < numStackFrames; i++) { string[] frameInfo = frameStrings[i].Split(';'); if (frameInfo.Length >= 3) { if (frameInfo[3].Contains("~")) { // Need to lengthen the path used by Visual Studio. StringBuilder longPathName = new StringBuilder(1024); GetLongPathName(frameInfo[3], longPathName, longPathName.Capacity); frameInfo[3] = longPathName.ToString(); } AD7StackFrame frame = AD7StackFrame.create(_engine, this, frameInfo, ref created); frame.SetFrameInfo(dwFieldSpec, out frameInfoArray[i]); } } if ((previousFrameInfoArray.Length != frameInfoArray.Length) || (created == true)) { previousFrameInfoArray = frameInfoArray; ppEnum = new AD7FrameInfoEnum(frameInfoArray); } else { bool isEqual = true; for (int i = 0; i < frameInfoArray.Length; i++) { if (frameInfoArray[i].m_bstrFuncName != previousFrameInfoArray[i].m_bstrFuncName) { isEqual = false; break; } if (frameInfoArray[i].m_dwValidFields != previousFrameInfoArray[i].m_dwValidFields) { isEqual = false; break; } if (frameInfoArray[i].m_bstrLanguage != previousFrameInfoArray[i].m_bstrLanguage) { isEqual = false; break; } } if (!isEqual) { previousFrameInfoArray = frameInfoArray; ppEnum = new AD7FrameInfoEnum(frameInfoArray); } else { ppEnum = new AD7FrameInfoEnum(previousFrameInfoArray); } } if ((this._id != "") && (this._id != this._engine.currentThread()._id)) _engine.eDispatcher.selectThread(this._engine.currentThread()._id); return Constants.S_OK; } catch (ComponentException e) { if ((this._id != "") && (this._id != this._engine.currentThread()._id)) _engine.eDispatcher.selectThread(this._engine.currentThread()._id); return e.HResult; } catch (Exception e) { if ((this._id != "") && (this._id != this._engine.currentThread()._id)) _engine.eDispatcher.selectThread(this._engine.currentThread()._id); return EngineUtils.UnexpectedException(e); } }