236 lines · python
1import lldb2from lldbsuite.test.decorators import *3from lldbsuite.test.lldbtest import *4import lldbsuite.test.lldbutil as lldbutil5 6 7class TestMembersAndLocalsWithSameName(TestBase):8 def test_when_stopped_in_method(self):9 self._load_exe()10 11 # Set breakpoints12 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 process22 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 breakpoints92 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 process102 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 executable192 exe_path = self.getBuildArtifact("a.out")193 194 # Load the executable195 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 break231 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