brintos

brintos / llvm-project-archived public Read only

0
0
Text · 9.4 KiB · 311a59d Raw
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