1import lldb 2from lldbsuite.test.decorators import * 3from lldbsuite.test.lldbtest import * 4import lldbsuite.test.lldbutil as lldbutil 5 6 7class TestMembersAndLocalsWithSameName(TestBase): 8 def test_when_stopped_in_method(self): 9 self._load_exe() 10 11 # Set breakpoints 12 bp1 = self.target.BreakpointCreateBySourceRegex("Break 1", self.src_file_spec) 13 self.assertTrue(bp1.IsValid() and bp1.GetNumLocations() >= 1, VALID_BREAKPOINT) 14 bp2 = self.target.BreakpointCreateBySourceRegex("Break 2", self.src_file_spec) 15 self.assertTrue(bp2.IsValid() and bp2.GetNumLocations() >= 1, VALID_BREAKPOINT) 16 bp3 = self.target.BreakpointCreateBySourceRegex("Break 3", self.src_file_spec) 17 self.assertTrue(bp3.IsValid() and bp3.GetNumLocations() >= 1, VALID_BREAKPOINT) 18 bp4 = self.target.BreakpointCreateBySourceRegex("Break 4", self.src_file_spec) 19 self.assertTrue(bp4.IsValid() and bp4.GetNumLocations() >= 1, VALID_BREAKPOINT) 20 21 # Launch the process 22 self.process = self.target.LaunchSimple( 23 None, None, self.get_process_working_directory() 24 ) 25 self.assertTrue(self.process.IsValid(), PROCESS_IS_VALID) 26 27 self.assertEqual(self.process.GetState(), lldb.eStateStopped, PROCESS_STOPPED) 28 29 self._test_globals() 30 31 self.process.Continue() 32 self.assertEqual(self.process.GetState(), lldb.eStateStopped, PROCESS_STOPPED) 33 thread = lldbutil.get_stopped_thread(self.process, lldb.eStopReasonBreakpoint) 34 self.assertTrue(thread.IsValid()) 35 frame = thread.GetSelectedFrame() 36 self.assertTrue(frame.IsValid()) 37 38 val = frame.EvaluateExpression("a") 39 self.assertTrue(val.IsValid()) 40 self.assertEqual(val.GetValueAsUnsigned(), 12345) 41 42 val = frame.EvaluateExpression("b") 43 self.assertTrue(val.IsValid()) 44 self.assertEqual(val.GetValueAsUnsigned(), 54321) 45 46 val = frame.EvaluateExpression("c") 47 self.assertTrue(val.IsValid()) 48 self.assertEqual(val.GetValueAsUnsigned(), 34567) 49 50 self.process.Continue() 51 self.assertEqual(self.process.GetState(), lldb.eStateStopped, PROCESS_STOPPED) 52 thread = lldbutil.get_stopped_thread(self.process, lldb.eStopReasonBreakpoint) 53 self.assertTrue(thread.IsValid()) 54 frame = thread.GetSelectedFrame() 55 self.assertTrue(frame.IsValid()) 56 57 val = frame.EvaluateExpression("a") 58 self.assertTrue(val.IsValid()) 59 self.assertEqual(val.GetValueAsUnsigned(), 10001) 60 61 val = frame.EvaluateExpression("b") 62 self.assertTrue(val.IsValid()) 63 self.assertEqual(val.GetValueAsUnsigned(), 10002) 64 65 val = frame.EvaluateExpression("c") 66 self.assertTrue(val.IsValid()) 67 self.assertEqual(val.GetValueAsUnsigned(), 10003) 68 69 self.process.Continue() 70 self.assertEqual(self.process.GetState(), lldb.eStateStopped, PROCESS_STOPPED) 71 thread = lldbutil.get_stopped_thread(self.process, lldb.eStopReasonBreakpoint) 72 self.assertTrue(thread.IsValid()) 73 frame = thread.GetSelectedFrame() 74 self.assertTrue(frame.IsValid()) 75 76 val = frame.EvaluateExpression("a") 77 self.assertTrue(val.IsValid()) 78 self.assertEqual(val.GetValueAsUnsigned(), 1) 79 80 val = frame.EvaluateExpression("b") 81 self.assertTrue(val.IsValid()) 82 self.assertEqual(val.GetValueAsUnsigned(), 2) 83 84 val = frame.EvaluateExpression("c") 85 self.assertTrue(val.IsValid()) 86 self.assertEqual(val.GetValueAsUnsigned(), 778899) 87 88 def test_when_stopped_in_function(self): 89 self._load_exe() 90 91 # Set breakpoints 92 bp1 = self.target.BreakpointCreateBySourceRegex("Break 1", self.src_file_spec) 93 self.assertTrue(bp1.IsValid() and bp1.GetNumLocations() >= 1, VALID_BREAKPOINT) 94 bp5 = self.target.BreakpointCreateBySourceRegex("Break 5", self.src_file_spec) 95 self.assertTrue(bp5.IsValid() and bp5.GetNumLocations() >= 1, VALID_BREAKPOINT) 96 bp6 = self.target.BreakpointCreateBySourceRegex("Break 6", self.src_file_spec) 97 self.assertTrue(bp6.IsValid() and bp6.GetNumLocations() >= 1, VALID_BREAKPOINT) 98 bp7 = self.target.BreakpointCreateBySourceRegex("Break 7", self.src_file_spec) 99 self.assertTrue(bp7.IsValid() and bp7.GetNumLocations() >= 1, VALID_BREAKPOINT) 100 101 # Launch the process 102 self.process = self.target.LaunchSimple( 103 None, None, self.get_process_working_directory() 104 ) 105 self.assertTrue(self.process.IsValid(), PROCESS_IS_VALID) 106 107 self.assertEqual(self.process.GetState(), lldb.eStateStopped, PROCESS_STOPPED) 108 109 self._test_globals() 110 111 self.process.Continue() 112 self.assertEqual(self.process.GetState(), lldb.eStateStopped, PROCESS_STOPPED) 113 thread = lldbutil.get_stopped_thread(self.process, lldb.eStopReasonBreakpoint) 114 self.assertTrue(thread.IsValid()) 115 frame = thread.GetSelectedFrame() 116 self.assertTrue(frame.IsValid()) 117 118 self.enable_expression_log() 119 val = frame.EvaluateExpression("a") 120 self.disable_expression_log_and_check_for_locals(["a"]) 121 self.assertTrue(val.IsValid()) 122 self.assertEqual(val.GetValueAsUnsigned(), 12345) 123 124 val = frame.EvaluateExpression("b") 125 self.assertTrue(val.IsValid()) 126 self.assertEqual(val.GetValueAsUnsigned(), 54321) 127 128 val = frame.EvaluateExpression("c") 129 self.assertTrue(val.IsValid()) 130 self.assertEqual(val.GetValueAsUnsigned(), 34567) 131 132 self.process.Continue() 133 self.assertEqual(self.process.GetState(), lldb.eStateStopped, PROCESS_STOPPED) 134 thread = lldbutil.get_stopped_thread(self.process, lldb.eStopReasonBreakpoint) 135 self.assertTrue(thread.IsValid()) 136 frame = thread.GetSelectedFrame() 137 self.assertTrue(frame.IsValid()) 138 139 val = frame.EvaluateExpression("a") 140 self.assertTrue(val.IsValid()) 141 self.assertEqual(val.GetValueAsUnsigned(), 10001) 142 143 val = frame.EvaluateExpression("b") 144 self.assertTrue(val.IsValid()) 145 self.assertEqual(val.GetValueAsUnsigned(), 10002) 146 147 val = frame.EvaluateExpression("c") 148 self.assertTrue(val.IsValid()) 149 self.assertEqual(val.GetValueAsUnsigned(), 10003) 150 151 self.enable_expression_log() 152 val = frame.EvaluateExpression("c-b") 153 self.disable_expression_log_and_check_for_locals(["c", "b"]) 154 self.assertTrue(val.IsValid()) 155 self.assertEqual(val.GetValueAsUnsigned(), 1) 156 157 self.process.Continue() 158 self.assertEqual(self.process.GetState(), lldb.eStateStopped, PROCESS_STOPPED) 159 thread = lldbutil.get_stopped_thread(self.process, lldb.eStopReasonBreakpoint) 160 self.assertTrue(thread.IsValid()) 161 frame = thread.GetSelectedFrame() 162 self.assertTrue(frame.IsValid()) 163 164 val = frame.EvaluateExpression("a") 165 self.assertTrue(val.IsValid()) 166 self.assertEqual(val.GetValueAsUnsigned(), 1) 167 168 val = frame.EvaluateExpression("b") 169 self.assertTrue(val.IsValid()) 170 self.assertEqual(val.GetValueAsUnsigned(), 2) 171 172 val = frame.EvaluateExpression("c") 173 self.assertTrue(val.IsValid()) 174 self.assertEqual(val.GetValueAsUnsigned(), 778899) 175 176 self.enable_expression_log() 177 val = frame.EvaluateExpression("a+b") 178 self.disable_expression_log_and_check_for_locals(["a", "b"]) 179 self.assertTrue(val.IsValid()) 180 self.assertEqual(val.GetValueAsUnsigned(), 3) 181 182 def _load_exe(self): 183 self.build() 184 185 cwd = os.getcwd() 186 187 src_file = os.path.join(cwd, "main.cpp") 188 self.src_file_spec = lldb.SBFileSpec(src_file) 189 self.assertTrue(self.src_file_spec.IsValid(), "breakpoint file") 190 191 # Get the path of the executable 192 exe_path = self.getBuildArtifact("a.out") 193 194 # Load the executable 195 self.target = self.dbg.CreateTarget(exe_path) 196 self.assertTrue(self.target.IsValid(), VALID_TARGET) 197 198 def _test_globals(self): 199 thread = lldbutil.get_stopped_thread(self.process, lldb.eStopReasonBreakpoint) 200 self.assertTrue(thread.IsValid()) 201 frame = thread.GetSelectedFrame() 202 self.assertTrue(frame.IsValid()) 203 204 self.enable_expression_log() 205 val = frame.EvaluateExpression("a") 206 self.disable_expression_log_and_check_for_locals([]) 207 self.assertTrue(val.IsValid()) 208 self.assertEqual(val.GetValueAsUnsigned(), 112233) 209 210 val = frame.EvaluateExpression("b") 211 self.assertTrue(val.IsValid()) 212 self.assertEqual(val.GetValueAsUnsigned(), 445566) 213 214 val = frame.EvaluateExpression("c") 215 self.assertTrue(val.IsValid()) 216 self.assertEqual(val.GetValueAsUnsigned(), 778899) 217 218 def enable_expression_log(self): 219 log_file = self.getBuildArtifact("expr.log") 220 self.runCmd("log enable -f '%s' lldb expr" % (log_file)) 221 222 def disable_expression_log_and_check_for_locals(self, variables): 223 log_file = self.getBuildArtifact("expr.log") 224 self.runCmd("log disable lldb expr") 225 local_var_regex = re.compile(r".*__lldb_local_vars::(.*);") 226 matched = [] 227 with open(log_file, "r") as log: 228 for line in log: 229 if line.find("LLDB_BODY_START") != -1: 230 break 231 m = re.match(local_var_regex, line) 232 if m: 233 self.assertIn(m.group(1), variables) 234 matched.append(m.group(1)) 235 self.assertEqual([item for item in variables if item not in matched], []) 236