internal bool TryUnwind(ThreadServant thread, TargetMemoryAccess memory, Mode mode, TargetAddress until) { StackFrame new_frame = null; try { new_frame = last_frame.UnwindStack(memory); } catch (TargetException) { } if (!TryCallback(thread, memory, ref new_frame, true)) { if ((new_frame == null) || !IsFrameOkForMode(new_frame, mode)) { if (!tried_lmf) { tried_lmf = true; if (thread.LMFAddress.IsNull) { return(false); } lmf_address = memory.ReadAddress(thread.LMFAddress); } if (!lmf_address.IsNull) { new_frame = TryLMF(thread, memory); } else { return(false); } } } if (new_frame == null) { return(false); } // Sanity check; don't loop. if (new_frame.StackPointer <= last_frame.StackPointer) { return(false); } if (!until.IsNull && (new_frame.StackPointer >= until)) { return(false); } AddFrame(new_frame); return(true); }