Index: lldb/packages/Python/lldbsuite/test/python_api/debugger/Makefile =================================================================== --- /dev/null +++ lldb/packages/Python/lldbsuite/test/python_api/debugger/Makefile @@ -0,0 +1,3 @@ +CXX_SOURCES := main.cpp + +include Makefile.rules Index: lldb/packages/Python/lldbsuite/test/python_api/debugger/main.cpp =================================================================== --- /dev/null +++ lldb/packages/Python/lldbsuite/test/python_api/debugger/main.cpp @@ -0,0 +1,18 @@ +//===-- main.cpp ------------------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + + +// This simple program is to test the lldb Python API SBDebugger. + +int func(int val) { + return val - 1; +} + +int main (int argc, char const *argv[]) { + return func(argc); +} Index: lldb/source/API/SBDebugger.cpp =================================================================== --- lldb/source/API/SBDebugger.cpp +++ lldb/source/API/SBDebugger.cpp @@ -1270,13 +1270,12 @@ ConstString(debugger_instance_name))); Status error; if (debugger_sp) { - ExecutionContext exe_ctx( - debugger_sp->GetCommandInterpreter().GetExecutionContext()); + ExecutionContext exe_ctx(debugger_sp->GetSelectedTarget(), true); error = debugger_sp->SetPropertyValue(&exe_ctx, eVarSetOperationAssign, var_name, value); } else { - error.SetErrorStringWithFormat("invalid debugger instance name '%s'", - debugger_instance_name); + error.SetErrorStringWithFormatv("invalid debugger instance name {0}", + debugger_instance_name); } if (error.Fail()) sb_error.SetError(error); @@ -1295,8 +1294,7 @@ ConstString(debugger_instance_name))); Status error; if (debugger_sp) { - ExecutionContext exe_ctx( - debugger_sp->GetCommandInterpreter().GetExecutionContext()); + ExecutionContext exe_ctx(debugger_sp->GetSelectedTarget(), true); lldb::OptionValueSP value_sp( debugger_sp->GetPropertyValue(&exe_ctx, var_name, false, error)); if (value_sp) { @@ -1308,7 +1306,15 @@ string_list.SplitIntoLines(value_str); return LLDB_RECORD_RESULT(SBStringList(&string_list)); } + } else { + Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); + LLDB_LOG_ERROR(log, error.ToError(), "cannot get property value: {0}"); } + } else { + Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); + error.SetErrorStringWithFormatv("invalid debugger instance name {0}", + debugger_instance_name); + LLDB_LOG_ERROR(log, error.ToError(), "cannot get internal variable: {0}"); } return LLDB_RECORD_RESULT(SBStringList()); } Index: lldb/test/API/python_api/debugger/TestDebuggerAPI.py =================================================================== --- lldb/test/API/python_api/debugger/TestDebuggerAPI.py +++ lldb/test/API/python_api/debugger/TestDebuggerAPI.py @@ -43,3 +43,54 @@ target = lldb.SBTarget() self.assertFalse(target.IsValid()) self.dbg.DeleteTarget(target) + + def test_debugger_internal_variable(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)