diff options
author | 2020-08-03 14:33:06 +0000 | |
---|---|---|
committer | 2020-08-03 14:33:06 +0000 | |
commit | 061da546b983eb767bad15e67af1174fb0bcf31c (patch) | |
tree | 83c78b820819d70aa40c36d90447978b300078c5 /gnu/llvm/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted | |
parent | Import LLVM 10.0.0 release including clang, lld and lldb. (diff) | |
download | wireguard-openbsd-061da546b983eb767bad15e67af1174fb0bcf31c.tar.xz wireguard-openbsd-061da546b983eb767bad15e67af1174fb0bcf31c.zip |
Import LLVM 10.0.0 release including clang, lld and lldb.
ok hackroom
tested by plenty
Diffstat (limited to 'gnu/llvm/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted')
4 files changed, 207 insertions, 0 deletions
diff --git a/gnu/llvm/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/Makefile b/gnu/llvm/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/Makefile new file mode 100644 index 00000000000..10495940055 --- /dev/null +++ b/gnu/llvm/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/Makefile @@ -0,0 +1,3 @@ +C_SOURCES := main.c + +include Makefile.rules diff --git a/gnu/llvm/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/Steps.py b/gnu/llvm/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/Steps.py new file mode 100644 index 00000000000..4133cbbe608 --- /dev/null +++ b/gnu/llvm/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/Steps.py @@ -0,0 +1,83 @@ +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") + +# This plan does a step-over until a variable changes value. +class StepUntil(StepWithChild): + def __init__(self, thread_plan, args_data, dict): + self.frame = thread_plan.GetThread().frames[0] + self.target = thread_plan.GetThread().GetProcess().GetTarget() + func_entry = args_data.GetValueForKey("variable_name") + + if not func_entry.IsValid(): + print("Did not get a valid entry for variable_name") + func_name = func_entry.GetStringValue(100) + + self.value = self.frame.FindVariable(func_name) + if self.value.GetError().Fail(): + print("Failed to get foo value: %s"%(self.value.GetError().GetCString())) + else: + print("'foo' value: %d"%(self.value.GetValueAsUnsigned())) + + StepWithChild.__init__(self, thread_plan) + + + def queue_child_thread_plan(self): + le = self.frame.GetLineEntry() + start_addr = le.GetStartAddress() + start = start_addr.GetLoadAddress(self.target) + end = le.GetEndAddress().GetLoadAddress(self.target) + return self.thread_plan.QueueThreadPlanForStepOverRange(start_addr, + end - start) + + def should_stop(self, event): + if not self.child_thread_plan.IsPlanComplete(): + return False + + # If we've stepped out of this frame, stop. + if not self.frame.IsValid(): + return True + + if not self.value.IsValid(): + return True + + print("Got next value: %d"%(self.value.GetValueAsUnsigned())) + if not self.value.GetValueDidChange(): + self.child_thread_plan = self.queue_child_thread_plan() + return False + else: + return True diff --git a/gnu/llvm/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/TestStepScripted.py b/gnu/llvm/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/TestStepScripted.py new file mode 100644 index 00000000000..eb1b5822580 --- /dev/null +++ b/gnu/llvm/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/TestStepScripted.py @@ -0,0 +1,108 @@ +""" +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 setUp(self): + TestBase.setUp(self) + self.main_source_file = lldb.SBFileSpec("main.c") + self.runCmd("command script import Steps.py") + + 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.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.step_out_with_scripted_plan("Steps.StepScripted") + + 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(), err.GetCString()) + + frame = thread.GetFrameAtIndex(0) + self.assertEqual("main", frame.GetFunctionName()) + + + def test_misspelled_plan_name(self): + """Test that we get a useful error if we misspell the plan class name""" + self.build() + (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(self, + "Set a breakpoint here", + self.main_source_file) + stop_id = process.GetStopID() + # Pass a non-existent class for the plan class: + err = thread.StepUsingScriptedThreadPlan("NoSuchModule.NoSuchPlan") + + # Make sure we got a good error: + self.assertTrue(err.Fail(), "We got a failure state") + msg = err.GetCString() + self.assertTrue("NoSuchModule.NoSuchPlan" in msg, "Mentioned missing class") + + # Make sure we didn't let the process run: + self.assertEqual(stop_id, process.GetStopID(), "Process didn't run") + + def test_checking_variable(self): + """Test that we can call SBValue API's from a scripted thread plan - using SBAPI's to step""" + self.do_test_checking_variable(False) + + def test_checking_variable_cli(self): + """Test that we can call SBValue API's from a scripted thread plan - using cli to step""" + self.do_test_checking_variable(True) + + def do_test_checking_variable(self, use_cli): + self.build() + (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()) + foo_val = frame.FindVariable("foo") + self.assertTrue(foo_val.GetError().Success(), "Got the foo variable") + self.assertEqual(foo_val.GetValueAsUnsigned(), 10, "foo starts at 10") + + if use_cli: + result = lldb.SBCommandReturnObject() + self.dbg.GetCommandInterpreter().HandleCommand( + "thread step-scripted -C Steps.StepUntil -k variable_name -v foo", + result) + self.assertTrue(result.Succeeded()) + else: + args_data = lldb.SBStructuredData() + data = lldb.SBStream() + data.Print('{"variable_name" : "foo"}') + error = args_data.SetFromJSON(data) + self.assertTrue(error.Success(), "Made the args_data correctly") + + err = thread.StepUsingScriptedThreadPlan("Steps.StepUntil", args_data, True) + self.assertTrue(err.Success(), err.GetCString()) + + # We should not have exited: + self.assertEqual(process.GetState(), lldb.eStateStopped, "We are stopped") + + # We should still be in foo: + self.assertEqual("foo", frame.GetFunctionName()) + + # And foo should have changed: + self.assertTrue(foo_val.GetValueDidChange(), "Foo changed") diff --git a/gnu/llvm/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/main.c b/gnu/llvm/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/main.c new file mode 100644 index 00000000000..bfd8a35d556 --- /dev/null +++ b/gnu/llvm/lldb/packages/Python/lldbsuite/test/functionalities/step_scripted/main.c @@ -0,0 +1,13 @@ +#include <stdio.h> + +void foo() { + int foo = 10; + printf("%d\n", foo); // Set a breakpoint here. + foo = 20; + printf("%d\n", foo); +} + +int main() { + foo(); + return 0; +} |