| """ |
| Test Debugger APIs. |
| """ |
| |
| import lldb |
| |
| from lldbsuite.test.decorators import * |
| from lldbsuite.test.lldbtest import * |
| from lldbsuite.test import lldbutil |
| |
| |
| class DebuggerAPITestCase(TestBase): |
| |
| mydir = TestBase.compute_mydir(__file__) |
| NO_DEBUG_INFO_TESTCASE = True |
| |
| def test_debugger_api_boundary_condition(self): |
| """Exercise SBDebugger APIs with boundary conditions.""" |
| self.dbg.HandleCommand(None) |
| self.dbg.SetDefaultArchitecture(None) |
| self.dbg.GetScriptingLanguage(None) |
| self.dbg.CreateTarget(None) |
| self.dbg.CreateTarget(None, None, None, True, lldb.SBError()) |
| self.dbg.CreateTargetWithFileAndTargetTriple(None, None) |
| self.dbg.CreateTargetWithFileAndArch(None, None) |
| self.dbg.FindTargetWithFileAndArch(None, None) |
| self.dbg.SetInternalVariable(None, None, None) |
| self.dbg.GetInternalVariableValue(None, None) |
| # FIXME (filcab): We must first allow for the swig bindings to know if |
| # a Python callback is set. (Check python-typemaps.swig) |
| # self.dbg.SetLoggingCallback(None) |
| self.dbg.SetPrompt(None) |
| self.dbg.SetCurrentPlatform(None) |
| self.dbg.SetCurrentPlatformSDKRoot(None) |
| |
| fresh_dbg = lldb.SBDebugger() |
| self.assertEquals(len(fresh_dbg), 0) |
| |
| def test_debugger_delete_invalid_target(self): |
| """SBDebugger.DeleteTarget() should not crash LLDB given and invalid target.""" |
| target = lldb.SBTarget() |
| self.assertFalse(target.IsValid()) |
| self.dbg.DeleteTarget(target) |
| |
| def test_debugger_internal_variables(self): |
| """Ensure that SBDebugger reachs the same instance of properties |
| regardless CommandInterpreter's context initialization""" |
| self.build() |
| exe = self.getBuildArtifact("a.out") |
| |
| # Create a target by the debugger. |
| target = self.dbg.CreateTarget(exe) |
| self.assertTrue(target, VALID_TARGET) |
| |
| property_name = "target.process.memory-cache-line-size" |
| |
| def get_cache_line_size(): |
| value_list = lldb.SBStringList() |
| value_list = self.dbg.GetInternalVariableValue(property_name, |
| self.dbg.GetInstanceName()) |
| |
| self.assertEqual(value_list.GetSize(), 1) |
| try: |
| return int(value_list.GetStringAtIndex(0)) |
| except ValueError as error: |
| self.fail("Value is not a number: " + error) |
| |
| # Get global property value while there are no processes. |
| global_cache_line_size = get_cache_line_size() |
| |
| # Run a process via SB interface. CommandInterpreter's execution context |
| # remains empty. |
| error = lldb.SBError() |
| launch_info = lldb.SBLaunchInfo(None) |
| launch_info.SetLaunchFlags(lldb.eLaunchFlagStopAtEntry) |
| process = target.Launch(launch_info, error) |
| self.assertTrue(process, PROCESS_IS_VALID) |
| |
| # This should change the value of a process's local property. |
| new_cache_line_size = global_cache_line_size + 512 |
| error = self.dbg.SetInternalVariable(property_name, |
| str(new_cache_line_size), |
| self.dbg.GetInstanceName()) |
| self.assertTrue(error.Success(), |
| property_name + " value was changed successfully") |
| |
| # Check that it was set actually. |
| self.assertEqual(get_cache_line_size(), new_cache_line_size) |
| |
| # Run any command to initialize CommandInterpreter's execution context. |
| self.runCmd("target list") |
| |
| # Test the local property again, is it set to new_cache_line_size? |
| self.assertEqual(get_cache_line_size(), new_cache_line_size) |