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 }); }
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)); } }
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 }); }
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); }
} //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; } }
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); }
public List <UnifiedStackFrame> GetStackTraceFromStoredEvent() { Util.VerifyHr(((IDebugSymbols3)_debugClient).SetScopeFromStoredEvent()); return(GetStackTraceFromContext(null, null)); }