forked from OSchip/llvm-project
[API] Extend the `SBThreadPlan` interface
Summary: This patch extends the `SBThreadPlan` to allow retrieving of thread plans for scripted steps. Reviewers: labath, zturner, jingham Reviewed By: jingham Subscribers: lldb-commits Tags: #lldb Differential Revision: https://reviews.llvm.org/D53361 llvm-svn: 345247
This commit is contained in:
parent
b4b6ec01c6
commit
c1c0fac765
|
@ -88,6 +88,8 @@ public:
|
|||
|
||||
SBThreadPlan QueueThreadPlanForRunToAddress(SBAddress address);
|
||||
|
||||
SBThreadPlan QueueThreadPlanForStepScripted(const char *script_class_name);
|
||||
|
||||
#ifndef SWIG
|
||||
lldb_private::ThreadPlan *get();
|
||||
#endif
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
LEVEL = ../../make
|
||||
|
||||
C_SOURCES := main.c
|
||||
|
||||
include $(LEVEL)/Makefile.rules
|
|
@ -0,0 +1,37 @@
|
|||
import lldb
|
||||
|
||||
class StepWithChild:
|
||||
def __init__(self, thread_plan):
|
||||
self.thread_plan = thread_plan
|
||||
self.child_thread_plan = self.queue_child_thread_plan()
|
||||
|
||||
def explains_stop(self, event):
|
||||
return False
|
||||
|
||||
def should_stop(self, event):
|
||||
if not self.child_thread_plan.IsPlanComplete():
|
||||
return False
|
||||
|
||||
self.thread_plan.SetPlanComplete(True)
|
||||
|
||||
return True
|
||||
|
||||
def should_step(self):
|
||||
return False
|
||||
|
||||
def queue_child_thread_plan(self):
|
||||
return None
|
||||
|
||||
class StepOut(StepWithChild):
|
||||
def __init__(self, thread_plan, dict):
|
||||
StepWithChild.__init__(self, thread_plan)
|
||||
|
||||
def queue_child_thread_plan(self):
|
||||
return self.thread_plan.QueueThreadPlanForStepOut(0)
|
||||
|
||||
class StepScripted(StepWithChild):
|
||||
def __init__(self, thread_plan, dict):
|
||||
StepWithChild.__init__(self, thread_plan)
|
||||
|
||||
def queue_child_thread_plan(self):
|
||||
return self.thread_plan.QueueThreadPlanForStepScripted("Steps.StepOut")
|
|
@ -0,0 +1,41 @@
|
|||
"""
|
||||
Tests stepping with scripted thread plans.
|
||||
"""
|
||||
|
||||
import lldb
|
||||
import lldbsuite.test.lldbutil as lldbutil
|
||||
from lldbsuite.test.lldbtest import *
|
||||
|
||||
class StepScriptedTestCase(TestBase):
|
||||
|
||||
mydir = TestBase.compute_mydir(__file__)
|
||||
|
||||
NO_DEBUG_INFO_TESTCASE = True
|
||||
|
||||
def test_standard_step_out(self):
|
||||
"""Tests stepping with the scripted thread plan laying over a standard thread plan for stepping out."""
|
||||
self.build()
|
||||
self.main_source_file = lldb.SBFileSpec("main.c")
|
||||
self.step_out_with_scripted_plan("Steps.StepOut")
|
||||
|
||||
def test_scripted_step_out(self):
|
||||
"""Tests stepping with the scripted thread plan laying over an another scripted thread plan for stepping out."""
|
||||
self.build()
|
||||
self.main_source_file = lldb.SBFileSpec("main.c")
|
||||
self.step_out_with_scripted_plan("Steps.StepScripted")
|
||||
|
||||
def setUp(self):
|
||||
TestBase.setUp(self)
|
||||
self.runCmd("command script import Steps.py")
|
||||
|
||||
def step_out_with_scripted_plan(self, name):
|
||||
(target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(self, "Set a breakpoint here", self.main_source_file)
|
||||
|
||||
frame = thread.GetFrameAtIndex(0)
|
||||
self.assertEqual("foo", frame.GetFunctionName())
|
||||
|
||||
err = thread.StepUsingScriptedThreadPlan(name)
|
||||
self.assertTrue(err.Success(), "Failed to step out")
|
||||
|
||||
frame = thread.GetFrameAtIndex(0)
|
||||
self.assertEqual("main", frame.GetFunctionName())
|
|
@ -0,0 +1,10 @@
|
|||
#include <stdio.h>
|
||||
|
||||
void foo() {
|
||||
printf("Set a breakpoint here.\n");
|
||||
}
|
||||
|
||||
int main() {
|
||||
foo();
|
||||
return 0;
|
||||
}
|
|
@ -106,6 +106,9 @@ public:
|
|||
SBThreadPlan
|
||||
QueueThreadPlanForRunToAddress (SBAddress address);
|
||||
|
||||
SBThreadPlan
|
||||
QueueThreadPlanForStepScripted(const char *script_class_name);
|
||||
|
||||
|
||||
protected:
|
||||
friend class SBBreakpoint;
|
||||
|
|
|
@ -207,3 +207,13 @@ SBThreadPlan::QueueThreadPlanForRunToAddress(SBAddress sb_address) {
|
|||
return SBThreadPlan();
|
||||
}
|
||||
}
|
||||
|
||||
SBThreadPlan
|
||||
SBThreadPlan::QueueThreadPlanForStepScripted(const char *script_class_name) {
|
||||
if (m_opaque_sp) {
|
||||
return SBThreadPlan(m_opaque_sp->GetThread().QueueThreadPlanForStepScripted(
|
||||
false, script_class_name, false));
|
||||
} else {
|
||||
return SBThreadPlan();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue