brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.4 KiB · 3a2e0d5 Raw
126 lines · python
1"""2Test breakpoint hit count features.3"""4 5 6import lldb7from lldbsuite.test.decorators import *8from lldbsuite.test.lldbtest import *9from lldbsuite.test import lldbutil10 11 12class BreakpointHitCountTestCase(TestBase):13    NO_DEBUG_INFO_TESTCASE = True14 15    @add_test_categories(["pyapi"])16    def test_breakpoint_location_hit_count(self):17        """Use Python APIs to check breakpoint hit count."""18        self.build()19        self.do_test_breakpoint_location_hit_count()20 21    def test_breakpoint_one_shot(self):22        """Check that one-shot breakpoints trigger only once."""23        self.build()24        target = self.createTestTarget()25 26        self.runCmd("tb a")27        process = target.LaunchSimple(None, None, self.get_process_working_directory())28        self.assertTrue(process, PROCESS_IS_VALID)29 30        from lldbsuite.test.lldbutil import get_stopped_thread31 32        thread = get_stopped_thread(process, lldb.eStopReasonBreakpoint)33        self.assertTrue(34            thread.IsValid(), "There should be a thread stopped due to breakpoint"35        )36 37        frame0 = thread.GetFrameAtIndex(0)38        self.assertTrue(39            frame0.GetFunctionName() == "a(int)"40            or frame0.GetFunctionName() == "int a(int)"41        )42 43        process.Continue()44        self.assertState(process.GetState(), lldb.eStateExited)45 46    def setUp(self):47        # Call super's setUp().48        TestBase.setUp(self)49        self.a_int_body_line_no = line_number("main.cpp", "// Breakpoint Location 1")50        self.a_float_body_line_no = line_number("main.cpp", "// Breakpoint Location 2")51 52    def do_test_breakpoint_location_hit_count(self):53        """Use Python APIs to check breakpoint hit count."""54        target = self.createTestTarget()55 56        # Create a breakpoint in main.cpp by name 'a',57        # there should be two locations.58        breakpoint = target.BreakpointCreateByName("a", "a.out")59        self.assertTrue(60            breakpoint and breakpoint.GetNumLocations() == 2, VALID_BREAKPOINT61        )62 63        # Verify all breakpoint locations are enabled.64        location1 = breakpoint.GetLocationAtIndex(0)65        self.assertTrue(location1 and location1.IsEnabled(), VALID_BREAKPOINT_LOCATION)66 67        location2 = breakpoint.GetLocationAtIndex(1)68        self.assertTrue(location2 and location2.IsEnabled(), VALID_BREAKPOINT_LOCATION)69 70        # Launch the process, and do not stop at entry point.71        process = target.LaunchSimple(None, None, self.get_process_working_directory())72        self.assertTrue(process, PROCESS_IS_VALID)73 74        # Verify 1st breakpoint location is hit.75        from lldbsuite.test.lldbutil import get_stopped_thread76 77        thread = get_stopped_thread(process, lldb.eStopReasonBreakpoint)78        self.assertTrue(79            thread.IsValid(), "There should be a thread stopped due to breakpoint"80        )81 82        frame0 = thread.GetFrameAtIndex(0)83        location1 = breakpoint.FindLocationByAddress(frame0.GetPC())84        self.assertEqual(85            frame0.GetLineEntry().GetLine(),86            self.a_int_body_line_no,87            "Stopped in int a(int)",88        )89        self.assertTrue(location1)90        self.assertEqual(location1.GetHitCount(), 1)91        self.assertEqual(breakpoint.GetHitCount(), 1)92 93        process.Continue()94 95        # Verify 2nd breakpoint location is hit.96        thread = get_stopped_thread(process, lldb.eStopReasonBreakpoint)97        self.assertTrue(98            thread.IsValid(), "There should be a thread stopped due to breakpoint"99        )100 101        frame0 = thread.GetFrameAtIndex(0)102        location2 = breakpoint.FindLocationByAddress(frame0.GetPC())103        self.assertEqual(104            frame0.GetLineEntry().GetLine(),105            self.a_float_body_line_no,106            "Stopped in float a(float)",107        )108        self.assertTrue(location2)109        self.assertEqual(location2.GetHitCount(), 1)110        self.assertEqual(location1.GetHitCount(), 1)111        self.assertEqual(breakpoint.GetHitCount(), 2)112 113        process.Continue()114 115        # Verify 2nd breakpoint location is hit again.116        thread = get_stopped_thread(process, lldb.eStopReasonBreakpoint)117        self.assertTrue(118            thread.IsValid(), "There should be a thread stopped due to breakpoint"119        )120 121        self.assertEqual(location2.GetHitCount(), 2)122        self.assertEqual(location1.GetHitCount(), 1)123        self.assertEqual(breakpoint.GetHitCount(), 3)124 125        process.Continue()126