VerifyHr() 공개 정적인 메소드

public static VerifyHr ( int hr ) : void
hr int
리턴 void
예제 #1
0
파일: MixedStack.cs 프로젝트: tiandian/msos
        private ThreadInformation GetThreadInfo(uint?threadIndex)
        {
            uint engineThreadId, osThreadId;

            if (threadIndex.HasValue)
            {
                uint[] engineThreadIds = new uint[1];
                uint[] osThreadIds     = new uint[1];
                Util.VerifyHr(((IDebugSystemObjects)_debugClient).GetThreadIdsByIndex(threadIndex.Value, 1, engineThreadIds, osThreadIds));
                engineThreadId = engineThreadIds[0];
                osThreadId     = osThreadIds[0];
            }
            else
            {
                Util.VerifyHr(((IDebugSystemObjects)_debugClient).GetCurrentThreadId(out engineThreadId));
                Util.VerifyHr(((IDebugSystemObjects)_debugClient).GetCurrentThreadSystemId(out osThreadId));
            }
            ClrThread managedThread = _runtime.Threads.FirstOrDefault(thread => thread.OSThreadId == osThreadId);

            return(new ThreadInformation
            {
                Index = threadIndex ?? uint.MaxValue,
                EngineThreadId = engineThreadId,
                OSThreadId = osThreadId,
                ManagedThread = managedThread
            });
        }
예제 #2
0
파일: MixedStack.cs 프로젝트: tiandian/msos
        public UnifiedStackTraces(IDebugClient debugClient, CommandExecutionContext context)
        {
            _debugClient = debugClient;
            _context     = context;
            _runtime     = context.Runtime;

            Util.VerifyHr(
                ((IDebugSystemObjects)_debugClient).GetNumberThreads(out _numThreads));

            for (uint threadIdx = 0; threadIdx < _numThreads; ++threadIdx)
            {
                Threads.Add(GetThreadInfo(threadIdx));
            }
        }
예제 #3
0
        private ThreadInfo GetThreadInfo(uint threadIndex)
        {
            uint[] engineThreadIds = new uint[1];
            uint[] osThreadIds     = new uint[1];
            Util.VerifyHr(((IDebugSystemObjects)_debugClient).GetThreadIdsByIndex(threadIndex, 1, engineThreadIds, osThreadIds));
            ClrThread managedThread = _runtime.Threads.FirstOrDefault(thread => thread.OSThreadId == osThreadIds[0]);

            return(new ThreadInfo
            {
                Index = threadIndex,
                EngineThreadId = engineThreadIds[0],
                OSThreadId = osThreadIds[0],
                ManagedThread = managedThread
            });
        }
예제 #4
0
        private List <UnifiedStackFrame> GetNativeStackTrace(uint engineThreadId)
        {
            Util.VerifyHr(((IDebugSystemObjects)_debugClient).SetCurrentThreadId(engineThreadId));

            DEBUG_STACK_FRAME[] stackFrames = new DEBUG_STACK_FRAME[200];
            uint framesFilled;

            Util.VerifyHr(((IDebugControl)_debugClient).GetStackTrace(0, 0, 0, stackFrames, stackFrames.Length, out framesFilled));

            List <UnifiedStackFrame> stackTrace = new List <UnifiedStackFrame>();

            for (uint i = 0; i < framesFilled; ++i)
            {
                stackTrace.Add(new UnifiedStackFrame(stackFrames[i], (IDebugSymbols2)_debugClient));
            }
            return(stackTrace);
        }
예제 #5
0
파일: MixedStack.cs 프로젝트: tiandian/msos
        }                                                       //Used for linking managed frame to native frame

        public UnifiedStackFrame(DEBUG_STACK_FRAME nativeFrame, IDebugSymbols2 debugSymbols)
        {
            Type = UnifiedStackFrameType.Native;
            InstructionPointer = nativeFrame.InstructionOffset;
            StackPointer       = nativeFrame.StackOffset;
            FramePointer       = nativeFrame.FrameOffset;

            uint  moduleIndex;
            ulong dummy;

            if (0 != debugSymbols.GetModuleByOffset(InstructionPointer, 0, out moduleIndex, out dummy))
            {
                //Some frames might not have modules associated with them, in which case this
                //will fail, and of course there is no function associated either. This happens
                //often with CLR JIT-compiled code.
                Module = "<Unknown>";
                Method = "<Unknown>";
                return;
            }

            StringBuilder methodName = new StringBuilder(1024);
            ulong         displacement;
            uint          dummy2;

            Util.VerifyHr(debugSymbols.GetNameByOffset(InstructionPointer, methodName, methodName.Capacity, out dummy2, out displacement));

            string[] parts = methodName.ToString().Split('!');
            Module = parts[0];
            if (parts.Length > 1)
            {
                Method = parts[1];
            }
            OffsetInMethod = displacement;

            uint          sourceLine;
            ulong         delta;
            StringBuilder sourceFile = new StringBuilder(1024);

            if (0 == debugSymbols.GetLineByOffset(InstructionPointer, out sourceLine, sourceFile, sourceFile.Capacity, out dummy2, out delta))
            {
                SourceFileName      = sourceFile.ToString();
                SourceLineNumber    = sourceLine;
                SourceLineNumberEnd = sourceLine;
            }
        }
예제 #6
0
파일: MixedStack.cs 프로젝트: tiandian/msos
        private List <UnifiedStackFrame> GetNativeStackTrace(uint?engineThreadId, CONTEXT?context)
        {
            if (engineThreadId.HasValue)
            {
                Util.VerifyHr(((IDebugSystemObjects)_debugClient).SetCurrentThreadId(engineThreadId.Value));
            }

            DEBUG_STACK_FRAME[] stackFrames = new DEBUG_STACK_FRAME[200];
            uint framesFilled;

            if (context.HasValue)
            {
                int    ctxSize      = Marshal.SizeOf(context);
                IntPtr ctxPtr       = Marshal.AllocHGlobal(ctxSize);
                IntPtr frameCtxsPtr = Marshal.AllocHGlobal(ctxSize * stackFrames.Length);
                try
                {
                    Marshal.StructureToPtr(context, ctxPtr, false);
                    Util.VerifyHr(((IDebugControl4)_debugClient).GetContextStackTrace(
                                      ctxPtr, (uint)ctxSize, stackFrames, stackFrames.Length, frameCtxsPtr, (uint)(stackFrames.Length * ctxSize), (uint)ctxSize, out framesFilled));
                }
                finally
                {
                    Marshal.FreeHGlobal(ctxPtr);
                    Marshal.FreeHGlobal(frameCtxsPtr);
                }
            }
            else
            {
                Util.VerifyHr(((IDebugControl)_debugClient).GetStackTrace(
                                  0, 0, 0, stackFrames, stackFrames.Length, out framesFilled));
            }

            List <UnifiedStackFrame> stackTrace = new List <UnifiedStackFrame>();

            for (uint i = 0; i < framesFilled; ++i)
            {
                stackTrace.Add(new UnifiedStackFrame(stackFrames[i], (IDebugSymbols2)_debugClient));
            }
            return(stackTrace);
        }
예제 #7
0
파일: MixedStack.cs 프로젝트: tiandian/msos
 public List <UnifiedStackFrame> GetStackTraceFromStoredEvent()
 {
     Util.VerifyHr(((IDebugSymbols3)_debugClient).SetScopeFromStoredEvent());
     return(GetStackTraceFromContext(null, null));
 }