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.
git-svn-id: https://llvm.org/svn/llvm-project/llvdb/trunk@123673 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/Plugins/Process/Utility/UnwindLLDB.cpp b/source/Plugins/Process/Utility/UnwindLLDB.cpp
index 30c867e..533c21c 100644
--- a/source/Plugins/Process/Utility/UnwindLLDB.cpp
+++ b/source/Plugins/Process/Utility/UnwindLLDB.cpp
@@ -76,7 +76,7 @@
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 @@
}
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 @@
}
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);