Exemple #1
0
        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)
 {
 }
Exemple #3
0
        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);
        }
Exemple #4
0
 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);
 }
Exemple #5
0
 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()
Exemple #6
0
        } // 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;
 }
Exemple #10
0
 public FrameInfo(DEBUG_STACK_FRAME_EX stackFrame, ThreadContext frameContext)
 {
     StackFrame   = stackFrame;
     FrameContext = frameContext;
 }