Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions lldb/source/Target/ThreadPlanStepOut.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -364,8 +364,12 @@ bool ThreadPlanStepOut::ShouldStop(Event *event_ptr) {
}

if (!done) {
StackID frame_zero_id = GetThread().GetStackFrameAtIndex(0)->GetStackID();
done = !(frame_zero_id < m_step_out_to_id);
StopInfoSP stop_info_sp = GetPrivateStopInfo();
if (stop_info_sp.get() &&
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
if (stop_info_sp.get() &&
if (stop_info_sp &&

stop_info_sp->GetStopReason() == eStopReasonBreakpoint) {
StackID frame_zero_id = GetThread().GetStackFrameAtIndex(0)->GetStackID();
done = !(frame_zero_id < m_step_out_to_id);
}
}

// The normal step out computations think we are done, so all we need to do
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
C_SOURCES := main.c

include Makefile.rules
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
"""
Test finish out of an empty function (may be one-instruction long)
"""

import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil


class FinishFromEmptyFunctionTestCase(TestBase):
NO_DEBUG_INFO_TESTCASE = True

def test_finish_from_empty_function(self):
"""Test that when stopped at a breakpoint in an empty function, finish leaves it correctly."""
self.build()
exe = self.getBuildArtifact("a.out")
target, process, thread, _ = lldbutil.run_to_name_breakpoint(
self, "done", exe_name=exe
)
if self.TraceOn():
self.runCmd("bt")

correct_stepped_out_line = line_number("main.c", "leaving main")
return_statement_line = line_number("main.c", "return 0")
safety_bp = target.BreakpointCreateByLocation(
lldb.SBFileSpec("main.c"), return_statement_line
)
self.assertTrue(safety_bp.IsValid())

error = lldb.SBError()
thread.StepOut(error)
self.assertTrue(error.Success())

if self.TraceOn():
self.runCmd("bt")

frame = thread.GetSelectedFrame()
self.assertEqual(
frame.line_entry.GetLine(),
correct_stepped_out_line,
"Step-out lost control of execution, ran too far",
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#include <stdio.h>
void done() {}
int main() {
puts("in main");
done();
puts("leaving main");
return 0;
}