Avoid infinite loops in stack backtraces and renamed:

bool RegisterContextLLDB::GetPC (addr_t& pc);

to:
    bool RegisterContextLLDB::ReadPC (addr_t& pc);
    
To avoid confusion with the GetPC() function that is part of the 
lldb_private::RegisterContext:

    uint64_t RegisterContext::GetPC (uint64_t fail_value);
    
Bad things could happen if the two got intermixed and the wrong one got
called.

Fixed inifinite loop detection by watching for two frames where the
RegisterContextLLDB::CursorSP contains the same start_pc and cfa.

    

llvm-svn: 123673
This commit is contained in:
Greg Clayton 2011-01-17 21:03:33 +00:00
parent b2a844bfe1
commit fc75303acb
3 changed files with 14 additions and 5 deletions

View File

@ -1246,7 +1246,7 @@ RegisterContextLLDB::GetStartPC (addr_t& start_pc)
return false;
if (!m_start_pc.IsValid())
{
return GetPC (start_pc);
return ReadPC (start_pc);
}
start_pc = m_start_pc.GetLoadAddress (&m_thread.GetProcess().GetTarget());
return true;
@ -1255,7 +1255,7 @@ RegisterContextLLDB::GetStartPC (addr_t& start_pc)
// Retrieve the current pc value for THIS frame, as saved by the NEXT frame.
bool
RegisterContextLLDB::GetPC (addr_t& pc)
RegisterContextLLDB::ReadPC (addr_t& pc)
{
if (!IsValid())
return false;

View File

@ -72,7 +72,7 @@ public:
GetStartPC (lldb::addr_t& start_pc);
bool
GetPC (lldb::addr_t& start_pc);
ReadPC (lldb::addr_t& start_pc);
private:

View File

@ -76,7 +76,7 @@ UnwindLLDB::AddFirstFrame ()
if (!first_register_ctx_ap->GetCFA (first_cursor_sp->cfa))
return false;
if (!first_register_ctx_ap->GetPC (first_cursor_sp->start_pc))
if (!first_register_ctx_ap->ReadPC (first_cursor_sp->start_pc))
return false;
// Everything checks out, so release the auto pointer value and let the
@ -132,7 +132,7 @@ UnwindLLDB::AddOneMoreFrame ()
}
return false;
}
if (!register_ctx_ap->GetPC (cursor_sp->start_pc))
if (!register_ctx_ap->ReadPC (cursor_sp->start_pc))
{
if (log)
{
@ -141,6 +141,15 @@ UnwindLLDB::AddOneMoreFrame ()
}
return false;
}
if (!m_frames.empty())
{
if ((m_frames.back()->start_pc == cursor_sp->start_pc) &&
(m_frames.back()->cfa == cursor_sp->cfa))
{
// Infinite loop where the current cursor is the same as the previous one...
return false;
}
}
RegisterContextSP register_ctx_sp(register_ctx_ap.release());
cursor_sp->reg_ctx = register_ctx_sp;
m_frames.push_back (cursor_sp);