internal unsafe static void ReportStackDetails() { VTable.DebugPrint("\nStack details:\n"); VTable.DebugPrint("\tTotal number of reserved pages: {0}", __arglist(TotalNumPages(PageType.Stack))); for (int i = 0; i < Thread.threadTable.Length; i++) { traceablePtrs.Initialize(); traceablePinnedPtrs.Initialize(); Thread t = Thread.threadTable[i]; if (t == null) { continue; } uint numStackFrames = CallStack.ScanStack(t, traceablePtrs, traceablePinnedPtrs); VTable.DebugPrint("\n\tThread: {0}", __arglist(i)); VTable.DebugPrint("\n\t\tStack frame count: {0}", __arglist(numStackFrames)); VTable.DebugPrint("\n\t\tManaged ptrs to static data: {0}", __arglist (traceablePtrs.managedPtrsToStaticData)); VTable.DebugPrint("\n\t\tManaged ptrs to stack: {0}", __arglist(traceablePtrs.managedPtrsToStack)); VTable.DebugPrint("\n\t\tExterior managed heap ptrs: {0}", __arglist (traceablePtrs.exteriorManagedHeapPtrs)); VTable.DebugPrint("\n\t\tInterior managed heap ptrs: {0}", __arglist (traceablePtrs.interiorManagedHeapPtrs)); #if !SINGULARITY UIntPtr stackTop = (UIntPtr)CallStack.StackMarker(t); uint stackSize = 0; if (stackTop != UIntPtr.Zero) { VTable.Assert(CallStack.StackBase(t) > stackTop, @"t.asmStackBase > stackTop"); stackSize = (uint)(CallStack.StackBase(t) - stackTop); } VTable.DebugPrint("\n\t\tApprox. stack size: {0}B", __arglist(stackSize)); #endif // REVIEW: Why are these here? VTable.Assert(traceablePinnedPtrs. managedPtrsToStaticData == 0, @"traceablePinnedPtrs. managedPtrsToStaticData == 0"); VTable.Assert(traceablePinnedPtrs. managedPtrsToStack == 0, @"traceablePinnedPtrs. managedPtrsToStack == 0"); VTable.DebugPrint("\n\t\tPinned managed heap ptrs: {0}", __arglist (traceablePinnedPtrs.exteriorManagedHeapPtrs + traceablePinnedPtrs.interiorManagedHeapPtrs)); } VTable.DebugPrint("\n"); }
void Verify(NonNullReferenceVisitor threadReferenceVisitor, Thread thread) { CallStack.ScanStack(thread, threadReferenceVisitor, threadReferenceVisitor); }