<rdar://problem/13194155>

Fixing an issue where threads and frames could get out of sync and cause ValueObjects to fail to retrieve their values correctly

llvm-svn: 177166
This commit is contained in:
Enrico Granata 2013-03-15 17:25:04 +00:00
parent c8541f2bf2
commit ebafd2f187
2 changed files with 16 additions and 14 deletions

View File

@ -815,22 +815,20 @@ lldb::StackFrameSP
ExecutionContextRef::GetFrameSP () const
{
lldb::StackFrameSP frame_sp (m_frame_wp.lock());
if (!frame_sp && m_stack_id.IsValid())
if (frame_sp)
{
lldb::ThreadSP thread_sp (GetThreadSP());
if (thread_sp)
{
frame_sp = thread_sp->GetFrameWithStackID (m_stack_id);
m_frame_wp = frame_sp;
}
else
{
// If the thread that this frame was supposed to belong to is not valid, then
// return a NULL frame_sp.
frame_sp.reset();
}
lldb::ThreadSP frame_thread_sp(frame_sp->GetThread());
if (frame_thread_sp && frame_thread_sp->IsValid())
return frame_sp;
}
return frame_sp;
lldb::ThreadSP thread_sp (GetThreadSP());
if (thread_sp && thread_sp->IsValid())
{
frame_sp = thread_sp->GetFrameWithStackID (m_stack_id);
m_frame_wp = frame_sp;
return frame_sp;
}
return lldb::StackFrameSP();
}
ExecutionContext

View File

@ -250,6 +250,10 @@ StackFrameList::SetCurrentInlinedDepth (uint32_t new_depth)
void
StackFrameList::GetFramesUpTo(uint32_t end_idx)
{
// this makes sure we do not fetch frames for an invalid thread
if (m_thread.IsValid() == false)
return;
// We've already gotten more frames than asked for, or we've already finished unwinding, return.
if (m_frames.size() > end_idx || GetAllFramesFetched())
return;