forked from OSchip/llvm-project
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:
parent
b2a844bfe1
commit
fc75303acb
|
@ -1246,7 +1246,7 @@ RegisterContextLLDB::GetStartPC (addr_t& start_pc)
|
||||||
return false;
|
return false;
|
||||||
if (!m_start_pc.IsValid())
|
if (!m_start_pc.IsValid())
|
||||||
{
|
{
|
||||||
return GetPC (start_pc);
|
return ReadPC (start_pc);
|
||||||
}
|
}
|
||||||
start_pc = m_start_pc.GetLoadAddress (&m_thread.GetProcess().GetTarget());
|
start_pc = m_start_pc.GetLoadAddress (&m_thread.GetProcess().GetTarget());
|
||||||
return true;
|
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.
|
// Retrieve the current pc value for THIS frame, as saved by the NEXT frame.
|
||||||
|
|
||||||
bool
|
bool
|
||||||
RegisterContextLLDB::GetPC (addr_t& pc)
|
RegisterContextLLDB::ReadPC (addr_t& pc)
|
||||||
{
|
{
|
||||||
if (!IsValid())
|
if (!IsValid())
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -72,7 +72,7 @@ public:
|
||||||
GetStartPC (lldb::addr_t& start_pc);
|
GetStartPC (lldb::addr_t& start_pc);
|
||||||
|
|
||||||
bool
|
bool
|
||||||
GetPC (lldb::addr_t& start_pc);
|
ReadPC (lldb::addr_t& start_pc);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
|
|
@ -76,7 +76,7 @@ UnwindLLDB::AddFirstFrame ()
|
||||||
if (!first_register_ctx_ap->GetCFA (first_cursor_sp->cfa))
|
if (!first_register_ctx_ap->GetCFA (first_cursor_sp->cfa))
|
||||||
return false;
|
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;
|
return false;
|
||||||
|
|
||||||
// Everything checks out, so release the auto pointer value and let the
|
// Everything checks out, so release the auto pointer value and let the
|
||||||
|
@ -132,7 +132,7 @@ UnwindLLDB::AddOneMoreFrame ()
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!register_ctx_ap->GetPC (cursor_sp->start_pc))
|
if (!register_ctx_ap->ReadPC (cursor_sp->start_pc))
|
||||||
{
|
{
|
||||||
if (log)
|
if (log)
|
||||||
{
|
{
|
||||||
|
@ -141,6 +141,15 @@ UnwindLLDB::AddOneMoreFrame ()
|
||||||
}
|
}
|
||||||
return false;
|
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());
|
RegisterContextSP register_ctx_sp(register_ctx_ap.release());
|
||||||
cursor_sp->reg_ctx = register_ctx_sp;
|
cursor_sp->reg_ctx = register_ctx_sp;
|
||||||
m_frames.push_back (cursor_sp);
|
m_frames.push_back (cursor_sp);
|
||||||
|
|
Loading…
Reference in New Issue