public static bool TryCreateFunction(DbgEngDebugger debugger, DbgEngContext context, DEBUG_STACK_FRAME_EX nativeStackFrame, out DbgFunction function, out ulong displacement) { function = null; displacement = 0; DbgSymbol sym = null; try { SymbolInfo si = DbgHelp.SymFromInlineContext(debugger.DebuggerInterface, nativeStackFrame.InstructionOffset, nativeStackFrame.InlineFrameContext, out displacement); sym = new DbgPublicSymbol(debugger, si, debugger.GetCurrentTarget()); function = new DbgNativeFunction(debugger, context, sym); return(true); } catch (DbgProviderException dpe) { // Sometimes the debugger doesn't know. E.g., frame 'e' here (from ntsd): // 0:000> kn // # Child-SP RetAddr Call Site // 00 00000000`0058dff8 00000000`76c02ef8 ntdll!NtRequestWaitReplyPort+0xa // 01 00000000`0058e000 00000000`76c352d1 kernel32!GetConsoleMode+0xf8 // 02 00000000`0058e030 00000000`76c4a60c kernel32!VerifyConsoleIoHandle+0x281 // 03 00000000`0058e180 000007fe`fae30fe1 kernel32!ReadConsoleW+0xbc // 04 00000000`0058e260 000007fe`fae1eb88 Microsoft_PowerShell_ConsoleHost_ni+0x70fe1 // 05 00000000`0058e390 000007fe`fae2a7e2 Microsoft_PowerShell_ConsoleHost_ni+0x5eb88 // 06 00000000`0058e410 000007fe`fae29fae Microsoft_PowerShell_ConsoleHost_ni+0x6a7e2 // 07 00000000`0058e4c0 000007fe`fae32bd1 Microsoft_PowerShell_ConsoleHost_ni+0x69fae // 08 00000000`0058e5b0 000007fe`fae235c6 Microsoft_PowerShell_ConsoleHost_ni+0x72bd1 // 09 00000000`0058e670 000007fe`fae23f27 Microsoft_PowerShell_ConsoleHost_ni+0x635c6 // 0a 00000000`0058e6d0 000007fe`fade5006 Microsoft_PowerShell_ConsoleHost_ni+0x63f27 // 0b 00000000`0058e760 000007fe`fade2c1a Microsoft_PowerShell_ConsoleHost_ni+0x25006 // 0c 00000000`0058e7e0 000007fe`fae33588 Microsoft_PowerShell_ConsoleHost_ni+0x22c1a // 0d 00000000`0058e890 000007fe`97f805de Microsoft_PowerShell_ConsoleHost_ni+0x73588 // 0e 00000000`0058e8f0 000007fe`f777dad3 0x000007fe`97f805de // 0f 00000000`0058ea80 000007fe`f777d7ae clr!PreBindAssemblyEx+0x13e07 // 10 00000000`0058eac0 000007fe`f777d830 clr!PreBindAssemblyEx+0x13ae2 // 11 00000000`0058eb00 000007fe`f76d0f3b clr!PreBindAssemblyEx+0x13b64 // 12 00000000`0058ecb0 000007fe`f76a9e5a clr!GetHistoryFileDirectory+0x945b // 13 00000000`0058ee80 000007fe`f76a9d54 clr!InitializeFusion+0x8b12 // 14 00000000`0058f170 000007fe`f76a98ce clr!InitializeFusion+0x8a0c // 15 00000000`0058f730 000007fe`f76a9826 clr!InitializeFusion+0x8586 // 16 00000000`0058f7a0 000007fe`f76aa078 clr!InitializeFusion+0x84de // 17 00000000`0058f830 000007fe`f8247b95 clr!CorExeMain+0x14 // 18 00000000`0058f870 000007fe`f82e5b21 mscoreei!CorExeMain+0x5d // 19 00000000`0058f8c0 00000000`76bf652d mscoree!CorExeMain+0x69 // 1a 00000000`0058f8f0 00000000`772ec521 kernel32!BaseThreadInitThunk+0xd // 1b 00000000`0058f920 00000000`00000000 ntdll!RtlUserThreadStart+0x21 LogManager.Trace("Could not get symbol for stack frame {0} on thread index {1}. Error: {2}", nativeStackFrame.FrameNumber, context.ThreadIndexOrAddress, Util.GetExceptionMessages(dpe)); } return(false); } // end TryCreateFunction()
internal DbgStackFrameInfo(DbgEngDebugger debugger, DbgUModeThreadInfo thread, DEBUG_STACK_FRAME_EX nativeFrame, ClrStackFrame managedFrame) : this(debugger, thread, nativeFrame, managedFrame, true) { }
private unsafe List <FrameInfo> GetCallstackFrames(ThreadContext threadContext) { const uint maxFrames = 1024; var frames = new DEBUG_STACK_FRAME_EX[maxFrames]; var contextSize = threadContext.Size; byte[] framesBuf = new byte[maxFrames * contextSize]; var machine = GetEffectiveMachine(); uint filled; List <FrameInfo> retVal; fixed(byte *framesContext = framesBuf) { int res = _control5.GetContextStackTraceEx((IntPtr)threadContext, contextSize, frames, frames.Length, (IntPtr)framesContext, (uint)framesBuf.Length, contextSize, out filled); if (res != 0) { ThrowDebuggerException(res, "IDebugControl5.GetContextStackTraceEx"); } retVal = new List <FrameInfo>((int)filled); } var intContextSize = (int)contextSize; for (var i = 0; i < filled; ++i) { var frameCtx = new ThreadContext(machine); Marshal.Copy(framesBuf, i * intContextSize, (IntPtr)frameCtx, intContextSize); retVal.Add(new FrameInfo(frames[i], frameCtx)); } return(retVal); }
public unsafe DEBUG_STACK_FRAME_EX[] GetCallStack(ulong frameOffset, ulong stackOffset, int maxItems) { return(RunAsync(() => { var frames = new DEBUG_STACK_FRAME_EX[maxItems]; uint totalFrames; Control.GetStackTraceEx(frameOffset, stackOffset, 0, frames, maxItems, &totalFrames).ThrowIfFailed(); Array.Resize(ref frames, (int)totalFrames); return frames; }).Result); }
private DbgUnknownFunction(DbgEngDebugger debugger, DbgEngContext context, DEBUG_STACK_FRAME_EX nativeFrame, ulong address, string modName, string funcName) : base(debugger, context, address, funcName) { NativeFrameEx = nativeFrame; m_modName = modName; } // end constructor()
} // end constructor() public static DbgUnknownFunction Create(DbgEngDebugger debugger, DbgEngContext context, DEBUG_STACK_FRAME_EX nativeFrame) { ulong address = nativeFrame.InstructionOffset; string modName = null; string funcName = null; ulong offset = 0; string fullname = null; // If our dbgeng has managed support (or support for whatever this is), let's // try that: if (0 != nativeFrame.InstructionOffset) { fullname = debugger.TryGetInfoFromFrame(nativeFrame, out modName, out funcName, out offset); if (String.IsNullOrEmpty(fullname)) { LogManager.Trace("DbgUnknownFunction.Create: dbgeng doesn't know, either."); } } else { LogManager.Trace("DbgUnknownFunction.Create: we have no chance with an InstructionOffset of zero."); } if (String.IsNullOrEmpty(fullname)) { funcName = DbgProvider.FormatUInt64(address, useTick: true); } else { address = address - offset; } return(new DbgUnknownFunction(debugger, context, nativeFrame, address, modName, funcName)); } // end static Create() factory
internal DbgStackFrameInfo(DbgEngDebugger debugger, DbgUModeThreadInfo thread, DEBUG_STACK_FRAME_EX nativeFrame, ClrStackFrame managedFrame, bool alreadySearchManagedFrames) : base(debugger) { if (null == thread) { throw new ArgumentNullException("thread"); } NativeFrameEx = nativeFrame; Thread = thread; m_managedFrame = managedFrame; m_alreadySearchedManagedFrames = alreadySearchManagedFrames; } // end constructor()
internal DbgStackFrameInfo(DbgEngDebugger debugger, DbgUModeThreadInfo thread, DEBUG_STACK_FRAME_EX nativeFrame) : this(debugger, thread, nativeFrame, null, false) { }
public StackFrameViewModel(DEBUG_STACK_FRAME_EX stackFrame) { StackFrame = stackFrame; }
public FrameInfo(DEBUG_STACK_FRAME_EX stackFrame, ThreadContext frameContext) { StackFrame = stackFrame; FrameContext = frameContext; }