xref: /llvm-project/lldb/test/API/python_api/frame/get-variables/TestGetVariables.py (revision 9c2468821ec51defd09c246fea4a47886fff8c01)
199451b44SJordan Rupprecht"""
299451b44SJordan RupprechtTest that SBFrame::GetVariables() calls work correctly.
399451b44SJordan Rupprecht"""
499451b44SJordan Rupprecht
599451b44SJordan Rupprechtimport lldb
699451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
799451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
899451b44SJordan Rupprechtfrom lldbsuite.test import lldbplatform
999451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
1099451b44SJordan Rupprecht
1199451b44SJordan Rupprecht
1299451b44SJordan Rupprechtdef get_names_from_value_list(value_list):
1399451b44SJordan Rupprecht    names = list()
1499451b44SJordan Rupprecht    for value in value_list:
1599451b44SJordan Rupprecht        names.append(value.GetName())
1699451b44SJordan Rupprecht    return names
1799451b44SJordan Rupprecht
1899451b44SJordan Rupprecht
1999451b44SJordan Rupprechtclass TestGetVariables(TestBase):
2099451b44SJordan Rupprecht    def setUp(self):
2199451b44SJordan Rupprecht        # Call super's setUp().
2299451b44SJordan Rupprecht        TestBase.setUp(self)
232238dcc3SJonas Devlieghere        self.source = "main.c"
2499451b44SJordan Rupprecht
2599451b44SJordan Rupprecht    def verify_variable_names(self, description, value_list, names):
2699451b44SJordan Rupprecht        copy_names = list(names)
2799451b44SJordan Rupprecht        actual_names = get_names_from_value_list(value_list)
2899451b44SJordan Rupprecht        for name in actual_names:
2999451b44SJordan Rupprecht            if name in copy_names:
3099451b44SJordan Rupprecht                copy_names.remove(name)
3199451b44SJordan Rupprecht            else:
322238dcc3SJonas Devlieghere                self.assertTrue(False, "didn't find '%s' in %s" % (name, copy_names))
3399451b44SJordan Rupprecht        self.assertEqual(
342238dcc3SJonas Devlieghere            len(copy_names),
352238dcc3SJonas Devlieghere            0,
362238dcc3SJonas Devlieghere            "%s: we didn't find variables: %s in value list (%s)"
372238dcc3SJonas Devlieghere            % (description, copy_names, actual_names),
382238dcc3SJonas Devlieghere        )
3999451b44SJordan Rupprecht
4099451b44SJordan Rupprecht    def test(self):
4199451b44SJordan Rupprecht        self.build()
4299451b44SJordan Rupprecht
4399451b44SJordan Rupprecht        # Set debugger into synchronous mode
4499451b44SJordan Rupprecht        self.dbg.SetAsync(False)
4599451b44SJordan Rupprecht
4699451b44SJordan Rupprecht        # Create a target by the debugger.
4799451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
4899451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
4999451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
5099451b44SJordan Rupprecht
512238dcc3SJonas Devlieghere        line1 = line_number(self.source, "// breakpoint 1")
522238dcc3SJonas Devlieghere        line2 = line_number(self.source, "// breakpoint 2")
532238dcc3SJonas Devlieghere        line3 = line_number(self.source, "// breakpoint 3")
5499451b44SJordan Rupprecht
5599451b44SJordan Rupprecht        breakpoint1 = target.BreakpointCreateByLocation(self.source, line1)
5699451b44SJordan Rupprecht        breakpoint2 = target.BreakpointCreateByLocation(self.source, line2)
5799451b44SJordan Rupprecht        breakpoint3 = target.BreakpointCreateByLocation(self.source, line3)
5899451b44SJordan Rupprecht
59*9c246882SJordan Rupprecht        self.assertGreaterEqual(breakpoint1.GetNumLocations(), 1, PROCESS_IS_VALID)
60*9c246882SJordan Rupprecht        self.assertGreaterEqual(breakpoint2.GetNumLocations(), 1, PROCESS_IS_VALID)
61*9c246882SJordan Rupprecht        self.assertGreaterEqual(breakpoint3.GetNumLocations(), 1, PROCESS_IS_VALID)
6299451b44SJordan Rupprecht
6399451b44SJordan Rupprecht        # Register our shared libraries for remote targets so they get
6499451b44SJordan Rupprecht        # automatically uploaded
6599451b44SJordan Rupprecht        arguments = None
6699451b44SJordan Rupprecht        environment = None
6799451b44SJordan Rupprecht
6899451b44SJordan Rupprecht        # Now launch the process, and do not stop at entry point.
6999451b44SJordan Rupprecht        process = target.LaunchSimple(
702238dcc3SJonas Devlieghere            arguments, environment, self.get_process_working_directory()
712238dcc3SJonas Devlieghere        )
7299451b44SJordan Rupprecht        self.assertTrue(process, PROCESS_IS_VALID)
7399451b44SJordan Rupprecht
742238dcc3SJonas Devlieghere        threads = lldbutil.get_threads_stopped_at_breakpoint(process, breakpoint1)
7599451b44SJordan Rupprecht        self.assertEqual(
762238dcc3SJonas Devlieghere            len(threads), 1, "There should be a thread stopped at breakpoint 1"
772238dcc3SJonas Devlieghere        )
7899451b44SJordan Rupprecht
7999451b44SJordan Rupprecht        thread = threads[0]
8099451b44SJordan Rupprecht        self.assertTrue(thread.IsValid(), "Thread must be valid")
8199451b44SJordan Rupprecht        frame = thread.GetFrameAtIndex(0)
8299451b44SJordan Rupprecht        self.assertTrue(frame.IsValid(), "Frame must be valid")
8399451b44SJordan Rupprecht
842238dcc3SJonas Devlieghere        arg_names = ["argc", "argv"]
852238dcc3SJonas Devlieghere        local_names = ["i", "j", "k"]
862238dcc3SJonas Devlieghere        static_names = ["static_var", "g_global_var", "g_static_var"]
872238dcc3SJonas Devlieghere        breakpoint1_locals = ["i"]
882238dcc3SJonas Devlieghere        breakpoint1_statics = ["static_var"]
8999451b44SJordan Rupprecht        num_args = len(arg_names)
9099451b44SJordan Rupprecht        num_locals = len(local_names)
9199451b44SJordan Rupprecht        num_statics = len(static_names)
9299451b44SJordan Rupprecht        args_yes = True
9399451b44SJordan Rupprecht        args_no = False
9499451b44SJordan Rupprecht        locals_yes = True
9599451b44SJordan Rupprecht        locals_no = False
9699451b44SJordan Rupprecht        statics_yes = True
9799451b44SJordan Rupprecht        statics_no = False
9899451b44SJordan Rupprecht        in_scopy_only = True
9999451b44SJordan Rupprecht        ignore_scope = False
10099451b44SJordan Rupprecht
10199451b44SJordan Rupprecht        # Verify if we ask for only arguments that we got what we expect
1022238dcc3SJonas Devlieghere        vars = frame.GetVariables(args_yes, locals_no, statics_no, ignore_scope)
10399451b44SJordan Rupprecht        self.assertEqual(
10499451b44SJordan Rupprecht            vars.GetSize(),
10599451b44SJordan Rupprecht            num_args,
1062238dcc3SJonas Devlieghere            "There should be %i arguments, but we are reporting %i"
1072238dcc3SJonas Devlieghere            % (num_args, vars.GetSize()),
1082238dcc3SJonas Devlieghere        )
10999451b44SJordan Rupprecht        self.verify_variable_names("check names of arguments", vars, arg_names)
11099451b44SJordan Rupprecht        self.assertEqual(
11199451b44SJordan Rupprecht            len(arg_names),
11299451b44SJordan Rupprecht            num_args,
1132238dcc3SJonas Devlieghere            "make sure verify_variable_names() didn't mutate list",
1142238dcc3SJonas Devlieghere        )
11599451b44SJordan Rupprecht
11699451b44SJordan Rupprecht        # Verify if we ask for only locals that we got what we expect
1172238dcc3SJonas Devlieghere        vars = frame.GetVariables(args_no, locals_yes, statics_no, ignore_scope)
11899451b44SJordan Rupprecht        self.assertEqual(
11999451b44SJordan Rupprecht            vars.GetSize(),
12099451b44SJordan Rupprecht            num_locals,
1212238dcc3SJonas Devlieghere            "There should be %i local variables, but we are reporting %i"
1222238dcc3SJonas Devlieghere            % (num_locals, vars.GetSize()),
1232238dcc3SJonas Devlieghere        )
12499451b44SJordan Rupprecht        self.verify_variable_names("check names of locals", vars, local_names)
12599451b44SJordan Rupprecht
12699451b44SJordan Rupprecht        # Verify if we ask for only statics that we got what we expect
1272238dcc3SJonas Devlieghere        vars = frame.GetVariables(args_no, locals_no, statics_yes, ignore_scope)
1282238dcc3SJonas Devlieghere        print("statics: ", str(vars))
12999451b44SJordan Rupprecht        self.assertEqual(
13099451b44SJordan Rupprecht            vars.GetSize(),
13199451b44SJordan Rupprecht            num_statics,
1322238dcc3SJonas Devlieghere            "There should be %i static variables, but we are reporting %i"
1332238dcc3SJonas Devlieghere            % (num_statics, vars.GetSize()),
1342238dcc3SJonas Devlieghere        )
1352238dcc3SJonas Devlieghere        self.verify_variable_names("check names of statics", vars, static_names)
13699451b44SJordan Rupprecht
13799451b44SJordan Rupprecht        # Verify if we ask for arguments and locals that we got what we expect
1382238dcc3SJonas Devlieghere        vars = frame.GetVariables(args_yes, locals_yes, statics_no, ignore_scope)
1392238dcc3SJonas Devlieghere        desc = "arguments + locals"
14099451b44SJordan Rupprecht        names = arg_names + local_names
14199451b44SJordan Rupprecht        count = len(names)
14299451b44SJordan Rupprecht        self.assertEqual(
14399451b44SJordan Rupprecht            vars.GetSize(),
14499451b44SJordan Rupprecht            count,
1452238dcc3SJonas Devlieghere            "There should be %i %s (%s) but we are reporting %i (%s)"
1462238dcc3SJonas Devlieghere            % (count, desc, names, vars.GetSize(), get_names_from_value_list(vars)),
1472238dcc3SJonas Devlieghere        )
14899451b44SJordan Rupprecht        self.verify_variable_names("check names of %s" % (desc), vars, names)
14999451b44SJordan Rupprecht
15099451b44SJordan Rupprecht        # Verify if we ask for arguments and statics that we got what we expect
1512238dcc3SJonas Devlieghere        vars = frame.GetVariables(args_yes, locals_no, statics_yes, ignore_scope)
1522238dcc3SJonas Devlieghere        desc = "arguments + statics"
15399451b44SJordan Rupprecht        names = arg_names + static_names
15499451b44SJordan Rupprecht        count = len(names)
15599451b44SJordan Rupprecht        self.assertEqual(
15699451b44SJordan Rupprecht            vars.GetSize(),
15799451b44SJordan Rupprecht            count,
1582238dcc3SJonas Devlieghere            "There should be %i %s (%s) but we are reporting %i (%s)"
1592238dcc3SJonas Devlieghere            % (count, desc, names, vars.GetSize(), get_names_from_value_list(vars)),
1602238dcc3SJonas Devlieghere        )
16199451b44SJordan Rupprecht        self.verify_variable_names("check names of %s" % (desc), vars, names)
16299451b44SJordan Rupprecht
16399451b44SJordan Rupprecht        # Verify if we ask for locals and statics that we got what we expect
1642238dcc3SJonas Devlieghere        vars = frame.GetVariables(args_no, locals_yes, statics_yes, ignore_scope)
1652238dcc3SJonas Devlieghere        desc = "locals + statics"
16699451b44SJordan Rupprecht        names = local_names + static_names
16799451b44SJordan Rupprecht        count = len(names)
16899451b44SJordan Rupprecht        self.assertEqual(
16999451b44SJordan Rupprecht            vars.GetSize(),
17099451b44SJordan Rupprecht            count,
1712238dcc3SJonas Devlieghere            "There should be %i %s (%s) but we are reporting %i (%s)"
1722238dcc3SJonas Devlieghere            % (count, desc, names, vars.GetSize(), get_names_from_value_list(vars)),
1732238dcc3SJonas Devlieghere        )
17499451b44SJordan Rupprecht        self.verify_variable_names("check names of %s" % (desc), vars, names)
17599451b44SJordan Rupprecht
17699451b44SJordan Rupprecht        # Verify if we ask for arguments, locals and statics that we got what
17799451b44SJordan Rupprecht        # we expect
1782238dcc3SJonas Devlieghere        vars = frame.GetVariables(args_yes, locals_yes, statics_yes, ignore_scope)
1792238dcc3SJonas Devlieghere        desc = "arguments + locals + statics"
18099451b44SJordan Rupprecht        names = arg_names + local_names + static_names
18199451b44SJordan Rupprecht        count = len(names)
18299451b44SJordan Rupprecht        self.assertEqual(
18399451b44SJordan Rupprecht            vars.GetSize(),
18499451b44SJordan Rupprecht            count,
1852238dcc3SJonas Devlieghere            "There should be %i %s (%s) but we are reporting %i (%s)"
1862238dcc3SJonas Devlieghere            % (count, desc, names, vars.GetSize(), get_names_from_value_list(vars)),
1872238dcc3SJonas Devlieghere        )
18899451b44SJordan Rupprecht        self.verify_variable_names("check names of %s" % (desc), vars, names)
18999451b44SJordan Rupprecht
19099451b44SJordan Rupprecht        # Verify if we ask for in scope locals that we got what we expect
1912238dcc3SJonas Devlieghere        vars = frame.GetVariables(args_no, locals_yes, statics_no, in_scopy_only)
1922238dcc3SJonas Devlieghere        desc = "in scope locals at breakpoint 1"
1932238dcc3SJonas Devlieghere        names = ["i"]
19499451b44SJordan Rupprecht        count = len(names)
19599451b44SJordan Rupprecht        self.assertEqual(
19699451b44SJordan Rupprecht            vars.GetSize(),
19799451b44SJordan Rupprecht            count,
1982238dcc3SJonas Devlieghere            "There should be %i %s (%s) but we are reporting %i (%s)"
1992238dcc3SJonas Devlieghere            % (count, desc, names, vars.GetSize(), get_names_from_value_list(vars)),
2002238dcc3SJonas Devlieghere        )
20199451b44SJordan Rupprecht        self.verify_variable_names("check names of %s" % (desc), vars, names)
20299451b44SJordan Rupprecht
20399451b44SJordan Rupprecht        # Continue to breakpoint 2
20499451b44SJordan Rupprecht        process.Continue()
20599451b44SJordan Rupprecht
2062238dcc3SJonas Devlieghere        threads = lldbutil.get_threads_stopped_at_breakpoint(process, breakpoint2)
20799451b44SJordan Rupprecht        self.assertEqual(
2082238dcc3SJonas Devlieghere            len(threads), 1, "There should be a thread stopped at breakpoint 2"
2092238dcc3SJonas Devlieghere        )
21099451b44SJordan Rupprecht
21199451b44SJordan Rupprecht        thread = threads[0]
21299451b44SJordan Rupprecht        self.assertTrue(thread.IsValid(), "Thread must be valid")
21399451b44SJordan Rupprecht        frame = thread.GetFrameAtIndex(0)
21499451b44SJordan Rupprecht        self.assertTrue(frame.IsValid(), "Frame must be valid")
21599451b44SJordan Rupprecht
21699451b44SJordan Rupprecht        # Verify if we ask for in scope locals that we got what we expect
2172238dcc3SJonas Devlieghere        vars = frame.GetVariables(args_no, locals_yes, statics_no, in_scopy_only)
2182238dcc3SJonas Devlieghere        desc = "in scope locals at breakpoint 2"
2192238dcc3SJonas Devlieghere        names = ["i", "j"]
22099451b44SJordan Rupprecht        count = len(names)
22199451b44SJordan Rupprecht        self.assertEqual(
22299451b44SJordan Rupprecht            vars.GetSize(),
22399451b44SJordan Rupprecht            count,
2242238dcc3SJonas Devlieghere            "There should be %i %s (%s) but we are reporting %i (%s)"
2252238dcc3SJonas Devlieghere            % (count, desc, names, vars.GetSize(), get_names_from_value_list(vars)),
2262238dcc3SJonas Devlieghere        )
22799451b44SJordan Rupprecht        self.verify_variable_names("check names of %s" % (desc), vars, names)
22899451b44SJordan Rupprecht
22999451b44SJordan Rupprecht        # Continue to breakpoint 3
23099451b44SJordan Rupprecht        process.Continue()
23199451b44SJordan Rupprecht
2322238dcc3SJonas Devlieghere        threads = lldbutil.get_threads_stopped_at_breakpoint(process, breakpoint3)
23399451b44SJordan Rupprecht        self.assertEqual(
2342238dcc3SJonas Devlieghere            len(threads), 1, "There should be a thread stopped at breakpoint 3"
2352238dcc3SJonas Devlieghere        )
23699451b44SJordan Rupprecht
23799451b44SJordan Rupprecht        thread = threads[0]
23899451b44SJordan Rupprecht        self.assertTrue(thread.IsValid(), "Thread must be valid")
23999451b44SJordan Rupprecht        frame = thread.GetFrameAtIndex(0)
24099451b44SJordan Rupprecht        self.assertTrue(frame.IsValid(), "Frame must be valid")
24199451b44SJordan Rupprecht
24299451b44SJordan Rupprecht        # Verify if we ask for in scope locals that we got what we expect
2432238dcc3SJonas Devlieghere        vars = frame.GetVariables(args_no, locals_yes, statics_no, in_scopy_only)
2442238dcc3SJonas Devlieghere        desc = "in scope locals at breakpoint 3"
2452238dcc3SJonas Devlieghere        names = ["i", "j", "k"]
24699451b44SJordan Rupprecht        count = len(names)
24799451b44SJordan Rupprecht        self.assertEqual(
24899451b44SJordan Rupprecht            vars.GetSize(),
24999451b44SJordan Rupprecht            count,
2502238dcc3SJonas Devlieghere            "There should be %i %s (%s) but we are reporting %i (%s)"
2512238dcc3SJonas Devlieghere            % (count, desc, names, vars.GetSize(), get_names_from_value_list(vars)),
2522238dcc3SJonas Devlieghere        )
25399451b44SJordan Rupprecht        self.verify_variable_names("check names of %s" % (desc), vars, names)
254