Index: lldb/include/lldb/Target/Thread.h =================================================================== --- lldb/include/lldb/Target/Thread.h +++ lldb/include/lldb/Target/Thread.h @@ -218,7 +218,7 @@ virtual void RefreshStateAfterStop() = 0; - void SelectMostRelevantFrame(); + void SelectMostRelevantFrame(lldb::StackFrameSP &frame_sp); std::string GetStopDescription(); @@ -396,9 +396,7 @@ return GetStackFrameList()->GetNumFrames(); } - virtual lldb::StackFrameSP GetStackFrameAtIndex(uint32_t idx) { - return GetStackFrameList()->GetFrameAtIndex(idx); - } + virtual lldb::StackFrameSP GetStackFrameAtIndex(uint32_t idx); virtual lldb::StackFrameSP GetFrameWithConcreteFrameIndex(uint32_t unwind_idx); Index: lldb/source/Target/AssertFrameRecognizer.cpp =================================================================== --- lldb/source/Target/AssertFrameRecognizer.cpp +++ lldb/source/Target/AssertFrameRecognizer.cpp @@ -118,8 +118,9 @@ // Fetch most relevant frame for (uint32_t frame_index = 0; frame_index < frames_to_fetch; frame_index++) { - prev_frame_sp = thread_sp->GetStackFrameAtIndex(frame_index); - + prev_frame_sp = frame_index == 0 + ? frame_sp + : thread_sp->GetStackFrameAtIndex(frame_index); if (!prev_frame_sp) { Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_UNWIND)); LLDB_LOG(log, "Abort Recognizer: Hit unwinding bound ({1} frames)!", Index: lldb/source/Target/Thread.cpp =================================================================== --- lldb/source/Target/Thread.cpp +++ lldb/source/Target/Thread.cpp @@ -578,14 +578,8 @@ return raw_stop_description; } -void Thread::SelectMostRelevantFrame() { +void Thread::SelectMostRelevantFrame(lldb::StackFrameSP &frame_sp) { Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_THREAD); - - auto frames_list_sp = GetStackFrameList(); - - // Only the top frame should be recognized. - auto frame_sp = frames_list_sp->GetFrameAtIndex(0); - auto recognized_frame_sp = frame_sp->GetRecognizedFrame(); if (!recognized_frame_sp) { @@ -606,8 +600,6 @@ void Thread::WillStop() { ThreadPlan *current_plan = GetCurrentPlan(); - SelectMostRelevantFrame(); - // FIXME: I may decide to disallow threads with no plans. In which // case this should go to an assert. @@ -1405,6 +1397,15 @@ exe_ctx.SetContext(shared_from_this()); } +lldb::StackFrameSP Thread::GetStackFrameAtIndex(uint32_t idx) { + auto frame = GetStackFrameList()->GetFrameAtIndex(idx); + + if (frame && idx == 0) + SelectMostRelevantFrame(frame); + + return frame; +} + StackFrameListSP Thread::GetStackFrameList() { std::lock_guard guard(m_frame_mutex);