aboutsummaryrefslogtreecommitdiff
path: root/lldb/test/API/python_api
diff options
context:
space:
mode:
authorTatyana Krasnukha <21970096+tkrasnukha@users.noreply.github.com>2020-12-10 19:30:04 +0300
committerTatyana Krasnukha <tatyana@synopsys.com>2020-12-12 16:40:59 +0300
commita01b26fb51c710a3a8ef88cc83b0701461f5b9ab (patch)
tree448aa6405f4bd8f98f14db61c21452ce368ff2c6 /lldb/test/API/python_api
parent7832d7e95ace589b2275bafe701ccb377a16b1b2 (diff)
downloadllvm-a01b26fb51c710a3a8ef88cc83b0701461f5b9ab.zip
llvm-a01b26fb51c710a3a8ef88cc83b0701461f5b9ab.tar.gz
llvm-a01b26fb51c710a3a8ef88cc83b0701461f5b9ab.tar.bz2
[lldb] Make CommandInterpreter's execution context the same as debugger's one.
Currently, the interpreter's context is not updated until a command is executed. This has resulted in the behavior of SB-interface functions and some commands depends on previous user actions. The interpreter's context can stay uninitialized, point to a currently selected target, or point to one of previously selected targets. This patch removes any usages of CommandInterpreter::UpdateExecutionContext. CommandInterpreter::HandleCommand* functions still may override context temporarily, but now they always restore it before exiting. CommandInterpreter saves overriden contexts to the stack, that makes nesting commands possible. Added test reproduces one of the issues. Without this fix, the last assertion fails because interpreter's execution context is empty until running "target list", so, the value of the global property was updated instead of process's local instance. Differential Revision: https://reviews.llvm.org/D92164
Diffstat (limited to 'lldb/test/API/python_api')
-rw-r--r--lldb/test/API/python_api/debugger/Makefile3
-rw-r--r--lldb/test/API/python_api/debugger/TestDebuggerAPI.py51
-rw-r--r--lldb/test/API/python_api/debugger/main.cpp9
3 files changed, 63 insertions, 0 deletions
diff --git a/lldb/test/API/python_api/debugger/Makefile b/lldb/test/API/python_api/debugger/Makefile
new file mode 100644
index 0000000..99998b2
--- /dev/null
+++ b/lldb/test/API/python_api/debugger/Makefile
@@ -0,0 +1,3 @@
+CXX_SOURCES := main.cpp
+
+include Makefile.rules
diff --git a/lldb/test/API/python_api/debugger/TestDebuggerAPI.py b/lldb/test/API/python_api/debugger/TestDebuggerAPI.py
index 32202ac..76cbace 100644
--- a/lldb/test/API/python_api/debugger/TestDebuggerAPI.py
+++ b/lldb/test/API/python_api/debugger/TestDebuggerAPI.py
@@ -43,3 +43,54 @@ class DebuggerAPITestCase(TestBase):
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)
diff --git a/lldb/test/API/python_api/debugger/main.cpp b/lldb/test/API/python_api/debugger/main.cpp
new file mode 100644
index 0000000..4b4ca68
--- /dev/null
+++ b/lldb/test/API/python_api/debugger/main.cpp
@@ -0,0 +1,9 @@
+// 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);
+}