Exemplo n.º 1
0
        private void DumpThread(ThreadEntry threadEntry)
        {
            using (NativeThread thread = threadEntry.Open(ThreadAcccessRights.GetContext | ThreadAcccessRights.SuspendResume | ThreadAcccessRights.QueryInformation)) {
                walker = new StackWalker(thread, memoryReader, resolver);

                try {
                    thread.Suspend();
                    var stack = walker.Walk();
                    foreach (var frame in stack)
                    {
                        var fun = resolver.FindFunctionAtAddr((IntPtr)frame.returnAddress);
                        Console.WriteLine($"{fun.name} {fun.virtualAddress-frame.returnAddress}");
                    }
                } finally {
                    thread.Resume();
                }
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Marks all the objects starting at the given frame
        /// </summary>
        /// <param name="generation">The generation</param>
        /// <param name="stackFrame">The stack frame</param>
        private void MarkAllObjects(CollectorGeneration generation, StackFrame stackFrame)
        {
            var stalkWalker = new StackWalker(this.virtualMachine.CallStack);

            stalkWalker.VisitObjectReferences(
                stackFrame,
                frameEntry =>
            {
                var objectPointer = new IntPtr(frameEntry.Value);
                this.MarkObject(generation, this.GetObjectReference(objectPointer));
            },
                frame =>
            {
                if (this.virtualMachine.Config.EnableDebug && this.virtualMachine.Config.PrintStackFrameWhenGC)
                {
                    RuntimeInterface.DebugLog($"{frame.Function.Definition.Name} ({frame.InstructionIndex})");
                    RuntimeInterface.PrintStackFrame(frame, false);
                }
            });
        }