Patch from Todd Fiala: lldb will seg fault if for some reason there is no unwinder when StackFrameList::GetFramesUpTo() is called.

Mainly patched to stop LLDB from crashing. This can easily happen if you debug to a remote gdbserver that doesn't have any dynamic register info and you don't have a target definition file specified.

llvm-svn: 195499
This commit is contained in:
Greg Clayton 2013-11-22 21:03:42 +00:00
parent 860934a924
commit ec6829eac0
1 changed files with 11 additions and 8 deletions

View File

@ -301,7 +301,7 @@ StackFrameList::GetFramesUpTo(uint32_t end_idx)
if (reg_ctx_sp)
{
const bool success = unwinder->GetFrameInfoAtIndex(idx, cfa, pc);
const bool success = unwinder && unwinder->GetFrameInfoAtIndex(idx, cfa, pc);
// There shouldn't be any way not to get the frame info for frame 0.
// But if the unwinder can't make one, lets make one by hand with the
// SP as the CFA and see if that gets any further.
@ -329,7 +329,7 @@ StackFrameList::GetFramesUpTo(uint32_t end_idx)
}
else
{
const bool success = unwinder->GetFrameInfoAtIndex(idx, cfa, pc);
const bool success = unwinder && unwinder->GetFrameInfoAtIndex(idx, cfa, pc);
if (!success)
{
// We've gotten to the end of the stack.
@ -451,14 +451,17 @@ StackFrameList::GetFramesUpTo(uint32_t end_idx)
{
if (end_idx < m_concrete_frames_fetched)
return;
uint32_t num_frames = unwinder->GetFramesUpTo(end_idx);
if (num_frames <= end_idx + 1)
if (unwinder)
{
//Done unwinding.
m_concrete_frames_fetched = UINT32_MAX;
uint32_t num_frames = unwinder->GetFramesUpTo(end_idx);
if (num_frames <= end_idx + 1)
{
//Done unwinding.
m_concrete_frames_fetched = UINT32_MAX;
}
m_frames.resize(num_frames);
}
m_frames.resize(num_frames);
}
}