123 lines · python
1"""Show global variables and check that they do indeed have global scopes."""2 3 4from lldbsuite.test.decorators import *5from lldbsuite.test.lldbtest import *6from lldbsuite.test import lldbutil7 8 9class GlobalVariablesTestCase(TestBase):10 def setUp(self):11 # Call super's setUp().12 TestBase.setUp(self)13 # Find the line number to break inside main().14 self.source = "main.c"15 self.line = line_number(self.source, "// Set break point at this line.")16 self.shlib_names = ["a"]17 18 @skipIfDarwin # Chained Fixups19 @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24764")20 def test_without_process(self):21 """Test that static initialized variables can be inspected without22 process."""23 self.build()24 25 # Create a target by the debugger.26 target = self.dbg.CreateTarget(self.getBuildArtifact("a.out"))27 28 self.assertTrue(target, VALID_TARGET)29 self.expect(30 "target variable g_ptr", VARIABLES_DISPLAYED_CORRECTLY, substrs=["(int *)"]31 )32 self.expect(33 "target variable *g_ptr", VARIABLES_DISPLAYED_CORRECTLY, substrs=["42"]34 )35 36 @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24764")37 def test_c_global_variables(self):38 """Test 'frame variable --scope --no-args' which omits args and shows scopes."""39 self.build()40 41 # Create a target by the debugger.42 target = self.dbg.CreateTarget(self.getBuildArtifact("a.out"))43 self.assertTrue(target, VALID_TARGET)44 45 # Break inside the main.46 lldbutil.run_break_set_by_file_and_line(47 self, self.source, self.line, num_expected_locations=1, loc_exact=True48 )49 50 # Register our shared libraries for remote targets so they get51 # automatically uploaded52 environment = self.registerSharedLibrariesWithTarget(target, self.shlib_names)53 54 # Now launch the process, and do not stop at entry point.55 process = target.LaunchSimple(56 None, environment, self.get_process_working_directory()57 )58 self.assertTrue(process, PROCESS_IS_VALID)59 60 # The stop reason of the thread should be breakpoint.61 self.expect(62 "thread list",63 STOPPED_DUE_TO_BREAKPOINT,64 substrs=["stopped", "stop reason = breakpoint"],65 )66 67 # The breakpoint should have a hit count of 1.68 lldbutil.check_breakpoint(self, bpno=1, expected_hit_count=1)69 70 # Test that the statically initialized variable can also be71 # inspected *with* a process.72 self.expect(73 "target variable g_ptr", VARIABLES_DISPLAYED_CORRECTLY, substrs=["(int *)"]74 )75 self.expect(76 "target variable *g_ptr", VARIABLES_DISPLAYED_CORRECTLY, substrs=["42"]77 )78 79 # Check that GLOBAL scopes are indicated for the variables.80 self.expect(81 "frame variable --show-types --scope --show-globals --no-args",82 VARIABLES_DISPLAYED_CORRECTLY,83 ordered=False,84 substrs=[85 "STATIC: (const char *) g_func_static_cstr",86 '"g_func_static_cstr"',87 "GLOBAL: (int *) g_ptr",88 "STATIC: (const int) g_file_static_int = 2",89 "GLOBAL: (int) g_common_1 = 21",90 "GLOBAL: (int) g_file_global_int = 42",91 "STATIC: (const char *) g_file_static_cstr",92 '"g_file_static_cstr"',93 "GLOBAL: (const char *) g_file_global_cstr",94 '"g_file_global_cstr"',95 ],96 )97 98 # 'frame variable' should support address-of operator.99 self.runCmd("frame variable &g_file_global_int")100 101 # Exercise the 'target variable' command to display globals in a.c102 # file.103 self.expect(104 "target variable g_a", VARIABLES_DISPLAYED_CORRECTLY, substrs=["g_a", "123"]105 )106 self.expect(107 "target variable g_marked_spot.x",108 VARIABLES_DISPLAYED_CORRECTLY,109 substrs=["g_marked_spot.x", "20"],110 )111 112 self.expect(113 "target variable g_marked_spot.y",114 VARIABLES_DISPLAYED_CORRECTLY,115 substrs=["g_marked_spot.y", "21"],116 )117 self.expect(118 "target variable g_marked_spot.y",119 VARIABLES_DISPLAYED_CORRECTLY,120 matching=False,121 substrs=["can't be resolved"],122 )123