aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Ingham <jingham@apple.com>2013-07-26 00:27:57 +0000
committerJim Ingham <jingham@apple.com>2013-07-26 00:27:57 +0000
commit6bea559652079732f2481054aace855a60e8c51d (patch)
tree58d661e1e1e1fec73deb5cb2fae379852160650c
parentca4c37b4874dfcbc2001852624644fa2a2c30f2c (diff)
downloadlldb-6bea559652079732f2481054aace855a60e8c51d.tar.gz
Refine the fix in r187094 to only distrust the StackID comparision when we are starting from an address with no symbols.
If we don't do that "nexti" will stop too soon when stepping past a tail call jump. rdar://problem/14516227 git-svn-id: https://llvm.org/svn/llvm-project/lldb/trunk@187173 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/lldb/Target/ThreadPlanStepInstruction.h1
-rw-r--r--source/Target/ThreadPlanStepInstruction.cpp13
2 files changed, 11 insertions, 3 deletions
diff --git a/include/lldb/Target/ThreadPlanStepInstruction.h b/include/lldb/Target/ThreadPlanStepInstruction.h
index 9210b142d..eb4a64bcb 100644
--- a/include/lldb/Target/ThreadPlanStepInstruction.h
+++ b/include/lldb/Target/ThreadPlanStepInstruction.h
@@ -50,6 +50,7 @@ private:
bool m_stop_other_threads;
bool m_step_over;
// These two are used only for the step over case.
+ bool m_start_has_symbol;
StackID m_stack_id;
StackID m_parent_frame_id;
diff --git a/source/Target/ThreadPlanStepInstruction.cpp b/source/Target/ThreadPlanStepInstruction.cpp
index b07b374e3..f644ee88f 100644
--- a/source/Target/ThreadPlanStepInstruction.cpp
+++ b/source/Target/ThreadPlanStepInstruction.cpp
@@ -44,7 +44,11 @@ ThreadPlanStepInstruction::ThreadPlanStepInstruction
m_step_over (step_over)
{
m_instruction_addr = m_thread.GetRegisterContext()->GetPC(0);
- m_stack_id = m_thread.GetStackFrameAtIndex(0)->GetStackID();
+ StackFrameSP m_start_frame_sp(m_thread.GetStackFrameAtIndex(0));
+ m_stack_id = m_start_frame_sp->GetStackID();
+
+ m_start_has_symbol = m_start_frame_sp->GetSymbolContext(eSymbolContextSymbol).symbol != NULL;
+
StackFrameSP parent_frame_sp = m_thread.GetStackFrameAtIndex(1);
if (parent_frame_sp)
m_parent_frame_id = parent_frame_sp->GetStackID();
@@ -68,6 +72,9 @@ ThreadPlanStepInstruction::GetDescription (Stream *s, lldb::DescriptionLevel lev
{
s->Printf ("Stepping one instruction past ");
s->Address(m_instruction_addr, sizeof (addr_t));
+ if (!m_start_has_symbol)
+ s->Printf(" which has no symbol");
+
if (m_step_over)
s->Printf(" stepping over calls");
else
@@ -123,7 +130,7 @@ ThreadPlanStepInstruction::ShouldStop (Event *event_ptr)
StackFrame *return_frame = m_thread.GetStackFrameAtIndex(1).get();
if (return_frame)
{
- if (return_frame->GetStackID() != m_parent_frame_id)
+ if (return_frame->GetStackID() != m_parent_frame_id || m_start_has_symbol)
{
if (log)
{
@@ -153,7 +160,7 @@ ThreadPlanStepInstruction::ShouldStop (Event *event_ptr)
{
if (log)
{
- log->PutCString("The stack id we are stepping in changed, but our parent frame did not. "
+ log->PutCString("The stack id we are stepping in changed, but our parent frame did not when stepping from code with no symbols. "
"We are probably just confused about where we are, stopping.");
}
SetPlanComplete();