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