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 QueueThreadPlanForRunToAddress(SBAddress address);
|
||||||
|
|
||||||
|
SBThreadPlan QueueThreadPlanForStepScripted(const char *script_class_name);
|
||||||
|
|
||||||
#ifndef SWIG
|
#ifndef SWIG
|
||||||
lldb_private::ThreadPlan *get();
|
lldb_private::ThreadPlan *get();
|
||||||
#endif
|
#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
|
SBThreadPlan
|
||||||
QueueThreadPlanForRunToAddress (SBAddress address);
|
QueueThreadPlanForRunToAddress (SBAddress address);
|
||||||
|
|
||||||
|
SBThreadPlan
|
||||||
|
QueueThreadPlanForStepScripted(const char *script_class_name);
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
friend class SBBreakpoint;
|
friend class SBBreakpoint;
|
||||||
|
|
|
@ -207,3 +207,13 @@ SBThreadPlan::QueueThreadPlanForRunToAddress(SBAddress sb_address) {
|
||||||
return SBThreadPlan();
|
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