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