private void BuildStackFrame(int skipFrames, bool fNeedFileInfo) { StackFrameHelper sfh = new StackFrameHelper(fNeedFileInfo, null); StackTrace.GetStackFramesInternal(sfh, 0, null); int numberOfFrames = sfh.GetNumberOfFrames(); skipFrames += StackTrace.CalculateFramesToSkip(sfh, numberOfFrames); if ((numberOfFrames - skipFrames) > 0) { this.method = sfh.GetMethodBase(skipFrames); this.offset = sfh.GetOffset(skipFrames); this.ILOffset = sfh.GetILOffset(skipFrames); if (fNeedFileInfo) { this.strFileName = sfh.GetFilename(skipFrames); this.iLineNumber = sfh.GetLineNumber(skipFrames); this.iColumnNumber = sfh.GetColumnNumber(skipFrames); } } }
// Retrieves an object with stack trace information encoded. // It leaves out the first "iSkip" lines of the stacktrace. // private void CaptureStackTrace(int iSkip, bool fNeedFileInfo, Thread targetThread, Exception e) { m_iMethodsToSkip += iSkip; using (StackFrameHelper StackF = new StackFrameHelper(targetThread)) { StackF.InitializeSourceInfo(0, fNeedFileInfo, e); m_iNumOfFrames = StackF.GetNumberOfFrames(); if (m_iMethodsToSkip > m_iNumOfFrames) m_iMethodsToSkip = m_iNumOfFrames; if (m_iNumOfFrames != 0) { frames = new StackFrame[m_iNumOfFrames]; for (int i = 0; i < m_iNumOfFrames; i++) { bool fDummy1 = true; bool fDummy2 = true; StackFrame sfTemp = new StackFrame(fDummy1, fDummy2); sfTemp.SetMethodBase(StackF.GetMethodBase(i)); sfTemp.SetOffset(StackF.GetOffset(i)); sfTemp.SetILOffset(StackF.GetILOffset(i)); #if FEATURE_EXCEPTIONDISPATCHINFO sfTemp.SetIsLastFrameFromForeignExceptionStackTrace(StackF.IsLastFrameFromForeignExceptionStackTrace(i)); #endif // FEATURE_EXCEPTIONDISPATCHINFO if (fNeedFileInfo) { sfTemp.SetFileName(StackF.GetFilename(i)); sfTemp.SetLineNumber(StackF.GetLineNumber(i)); sfTemp.SetColumnNumber(StackF.GetColumnNumber(i)); } frames[i] = sfTemp; } // CalculateFramesToSkip skips all frames in the System.Diagnostics namespace, // but this is not desired if building a stack trace from an exception. if (e == null) m_iMethodsToSkip += CalculateFramesToSkip(StackF, m_iNumOfFrames); m_iNumOfFrames -= m_iMethodsToSkip; if (m_iNumOfFrames < 0) { m_iNumOfFrames = 0; } } // In case this is the same object being re-used, set frames to null else frames = null; } }
internal static int CalculateFramesToSkip(StackFrameHelper StackF, int iNumFrames) { int iRetVal = 0; String PackageName = "System.Diagnostics"; // Check if this method is part of the System.Diagnostics // package. If so, increment counter keeping track of // System.Diagnostics functions for (int i = 0; i < iNumFrames; i++) { MethodBase mb = StackF.GetMethodBase(i); if (mb != null) { Type t = mb.DeclaringType; if (t == null) break; String ns = t.Namespace; if (ns == null) break; if (String.Compare(ns, PackageName, StringComparison.Ordinal) != 0) break; } iRetVal++; } return iRetVal; }
private void BuildStackFrame(int skipFrames, bool fNeedFileInfo) { StackFrameHelper StackF = new StackFrameHelper(fNeedFileInfo, null); StackTrace.GetStackFramesInternal (StackF, 0, null); int iNumOfFrames = StackF.GetNumberOfFrames(); skipFrames += StackTrace.CalculateFramesToSkip (StackF, iNumOfFrames); if ((iNumOfFrames - skipFrames) > 0) { method = StackF.GetMethodBase (skipFrames); offset = StackF.GetOffset (skipFrames); ILOffset = StackF.GetILOffset (skipFrames); if (fNeedFileInfo) { strFileName = StackF.GetFilename (skipFrames); iLineNumber = StackF.GetLineNumber (skipFrames); iColumnNumber = StackF.GetColumnNumber (skipFrames); } } }
// PRIVATE method to retrieve an object with stack trace information // encoded. // // This version leaves out the first "iSkip" lines of the stacktrace. private void CaptureStackTrace(int iSkip, bool fNeedFileInfo, Thread targetThread, Exception e) { m_iMethodsToSkip += iSkip; StackFrameHelper StackF = new StackFrameHelper(fNeedFileInfo, targetThread); GetStackFramesInternal (StackF, 0, e); m_iNumOfFrames = StackF.GetNumberOfFrames(); if (m_iNumOfFrames != 0) { frames = new StackFrame [m_iNumOfFrames]; for (int i=0; i<m_iNumOfFrames; i++) { bool fDummy1 = true; bool fDummy2 = true; StackFrame sfTemp = new StackFrame (fDummy1, fDummy2); sfTemp.SetMethodBase (StackF.GetMethodBase(i)); sfTemp.SetOffset (StackF.GetOffset(i)); sfTemp.SetILOffset (StackF.GetILOffset(i)); if (fNeedFileInfo) { sfTemp.SetFileName (StackF.GetFilename (i)); sfTemp.SetLineNumber (StackF.GetLineNumber (i)); sfTemp.SetColumnNumber (StackF.GetColumnNumber (i)); } frames [i] = sfTemp; } // CalculateFramesToSkip skips all frames in the System.Diagnostics namespace, // but this is not desired if building a stack trace from an exception. if (e == null) m_iMethodsToSkip += CalculateFramesToSkip (StackF, m_iNumOfFrames); m_iNumOfFrames -= m_iMethodsToSkip; if (m_iNumOfFrames < 0) m_iNumOfFrames = 0; } // In case this is the same object being re-used, set frames to null else frames = null; }
private void CaptureStackTrace(int iSkip, bool fNeedFileInfo, Thread targetThread, Exception e) { this.m_iMethodsToSkip += iSkip; StackFrameHelper sfh = new StackFrameHelper(fNeedFileInfo, targetThread); GetStackFramesInternal(sfh, 0, e); this.m_iNumOfFrames = sfh.GetNumberOfFrames(); if (this.m_iMethodsToSkip > this.m_iNumOfFrames) { this.m_iMethodsToSkip = this.m_iNumOfFrames; } if (this.m_iNumOfFrames != 0) { this.frames = new StackFrame[this.m_iNumOfFrames]; for (int i = 0; i < this.m_iNumOfFrames; i++) { bool flag = true; bool flag2 = true; StackFrame frame = new StackFrame(flag, flag2); frame.SetMethodBase(sfh.GetMethodBase(i)); frame.SetOffset(sfh.GetOffset(i)); frame.SetILOffset(sfh.GetILOffset(i)); if (fNeedFileInfo) { frame.SetFileName(sfh.GetFilename(i)); frame.SetLineNumber(sfh.GetLineNumber(i)); frame.SetColumnNumber(sfh.GetColumnNumber(i)); } this.frames[i] = frame; } if (e == null) { this.m_iMethodsToSkip += CalculateFramesToSkip(sfh, this.m_iNumOfFrames); } this.m_iNumOfFrames -= this.m_iMethodsToSkip; if (this.m_iNumOfFrames < 0) { this.m_iNumOfFrames = 0; } } else { this.frames = null; } }
internal static int CalculateFramesToSkip(StackFrameHelper StackF, int iNumFrames) { int num = 0; string strB = "System.Diagnostics"; for (int i = 0; i < iNumFrames; i++) { MethodBase methodBase = StackF.GetMethodBase(i); if (methodBase != null) { Type declaringType = methodBase.DeclaringType; if (declaringType == null) { return num; } string strA = declaringType.Namespace; if ((strA == null) || (string.Compare(strA, strB, StringComparison.Ordinal) != 0)) { return num; } } num++; } return num; }
// Retrieves an object with stack trace information encoded. // It leaves out the first "iSkip" lines of the stacktrace. // private void CaptureStackTrace(int iSkip, bool fNeedFileInfo, Thread targetThread, Exception e) { m_iMethodsToSkip += iSkip; using (StackFrameHelper StackF = new StackFrameHelper(targetThread)) { StackF.InitializeSourceInfo(0, fNeedFileInfo, e); m_iNumOfFrames = StackF.GetNumberOfFrames(); if (m_iMethodsToSkip > m_iNumOfFrames) { m_iMethodsToSkip = m_iNumOfFrames; } if (m_iNumOfFrames != 0) { frames = new StackFrame[m_iNumOfFrames]; for (int i = 0; i < m_iNumOfFrames; i++) { bool fDummy1 = true; bool fDummy2 = true; StackFrame sfTemp = new StackFrame(fDummy1, fDummy2); sfTemp.SetMethodBase(StackF.GetMethodBase(i)); sfTemp.SetOffset(StackF.GetOffset(i)); sfTemp.SetILOffset(StackF.GetILOffset(i)); #if FEATURE_EXCEPTIONDISPATCHINFO sfTemp.SetIsLastFrameFromForeignExceptionStackTrace(StackF.IsLastFrameFromForeignExceptionStackTrace(i)); #endif // FEATURE_EXCEPTIONDISPATCHINFO if (fNeedFileInfo) { sfTemp.SetFileName(StackF.GetFilename(i)); sfTemp.SetLineNumber(StackF.GetLineNumber(i)); sfTemp.SetColumnNumber(StackF.GetColumnNumber(i)); } frames[i] = sfTemp; } // CalculateFramesToSkip skips all frames in the System.Diagnostics namespace, // but this is not desired if building a stack trace from an exception. if (e == null) { m_iMethodsToSkip += CalculateFramesToSkip(StackF, m_iNumOfFrames); } m_iNumOfFrames -= m_iMethodsToSkip; if (m_iNumOfFrames < 0) { m_iNumOfFrames = 0; } } // In case this is the same object being re-used, set frames to null else { frames = null; } } }