199451b44SJordan Rupprecht""" 299451b44SJordan RupprechtTest breakpoint hit count features. 399451b44SJordan Rupprecht""" 499451b44SJordan Rupprecht 599451b44SJordan Rupprecht 699451b44SJordan Rupprechtimport lldb 799451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 899451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 999451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 1099451b44SJordan Rupprecht 1199451b44SJordan Rupprecht 1299451b44SJordan Rupprechtclass BreakpointHitCountTestCase(TestBase): 1399451b44SJordan Rupprecht 1499451b44SJordan Rupprecht NO_DEBUG_INFO_TESTCASE = True 1599451b44SJordan Rupprecht 1699451b44SJordan Rupprecht @add_test_categories(['pyapi']) 1799451b44SJordan Rupprecht def test_breakpoint_location_hit_count(self): 1899451b44SJordan Rupprecht """Use Python APIs to check breakpoint hit count.""" 1999451b44SJordan Rupprecht self.build() 2099451b44SJordan Rupprecht self.do_test_breakpoint_location_hit_count() 2199451b44SJordan Rupprecht 2299451b44SJordan Rupprecht def test_breakpoint_one_shot(self): 2399451b44SJordan Rupprecht """Check that one-shot breakpoints trigger only once.""" 2499451b44SJordan Rupprecht self.build() 2554c26872SRaphael Isemann target = self.createTestTarget() 2699451b44SJordan Rupprecht 2799451b44SJordan Rupprecht self.runCmd("tb a") 2899451b44SJordan Rupprecht process = target.LaunchSimple( 2999451b44SJordan Rupprecht None, None, self.get_process_working_directory()) 3099451b44SJordan Rupprecht self.assertTrue(process, PROCESS_IS_VALID) 3199451b44SJordan Rupprecht 3299451b44SJordan Rupprecht from lldbsuite.test.lldbutil import get_stopped_thread 3399451b44SJordan Rupprecht thread = get_stopped_thread(process, lldb.eStopReasonBreakpoint) 3499451b44SJordan Rupprecht self.assertTrue( 3599451b44SJordan Rupprecht thread.IsValid(), 3699451b44SJordan Rupprecht "There should be a thread stopped due to breakpoint") 3799451b44SJordan Rupprecht 3899451b44SJordan Rupprecht frame0 = thread.GetFrameAtIndex(0) 3916bf8926SJonas Devlieghere self.assertTrue(frame0.GetFunctionName() == "a(int)" or frame0.GetFunctionName() == "int a(int)"); 4099451b44SJordan Rupprecht 4199451b44SJordan Rupprecht process.Continue() 42*1b8c7352SJonas Devlieghere self.assertState(process.GetState(), lldb.eStateExited) 4399451b44SJordan Rupprecht 4499451b44SJordan Rupprecht def setUp(self): 4599451b44SJordan Rupprecht # Call super's setUp(). 4699451b44SJordan Rupprecht TestBase.setUp(self) 4799451b44SJordan Rupprecht self.a_int_body_line_no = line_number( 4899451b44SJordan Rupprecht 'main.cpp', '// Breakpoint Location 1') 4999451b44SJordan Rupprecht self.a_float_body_line_no = line_number( 5099451b44SJordan Rupprecht 'main.cpp', '// Breakpoint Location 2') 5199451b44SJordan Rupprecht 5299451b44SJordan Rupprecht def do_test_breakpoint_location_hit_count(self): 5399451b44SJordan Rupprecht """Use Python APIs to check breakpoint hit count.""" 5454c26872SRaphael Isemann target = self.createTestTarget() 5599451b44SJordan Rupprecht 5699451b44SJordan Rupprecht # Create a breakpoint in main.cpp by name 'a', 5799451b44SJordan Rupprecht # there should be two locations. 5899451b44SJordan Rupprecht breakpoint = target.BreakpointCreateByName('a', 'a.out') 5999451b44SJordan Rupprecht self.assertTrue(breakpoint and 6099451b44SJordan Rupprecht breakpoint.GetNumLocations() == 2, 6199451b44SJordan Rupprecht VALID_BREAKPOINT) 6299451b44SJordan Rupprecht 6399451b44SJordan Rupprecht # Verify all breakpoint locations are enabled. 6499451b44SJordan Rupprecht location1 = breakpoint.GetLocationAtIndex(0) 6599451b44SJordan Rupprecht self.assertTrue(location1 and 6699451b44SJordan Rupprecht location1.IsEnabled(), 6799451b44SJordan Rupprecht VALID_BREAKPOINT_LOCATION) 6899451b44SJordan Rupprecht 6999451b44SJordan Rupprecht location2 = breakpoint.GetLocationAtIndex(1) 7099451b44SJordan Rupprecht self.assertTrue(location2 and 7199451b44SJordan Rupprecht location2.IsEnabled(), 7299451b44SJordan Rupprecht VALID_BREAKPOINT_LOCATION) 7399451b44SJordan Rupprecht 7499451b44SJordan Rupprecht # Launch the process, and do not stop at entry point. 7599451b44SJordan Rupprecht process = target.LaunchSimple( 7699451b44SJordan Rupprecht None, None, self.get_process_working_directory()) 7799451b44SJordan Rupprecht self.assertTrue(process, PROCESS_IS_VALID) 7899451b44SJordan Rupprecht 7999451b44SJordan Rupprecht # Verify 1st breakpoint location is hit. 8099451b44SJordan Rupprecht from lldbsuite.test.lldbutil import get_stopped_thread 8199451b44SJordan Rupprecht thread = get_stopped_thread(process, lldb.eStopReasonBreakpoint) 8299451b44SJordan Rupprecht self.assertTrue( 8399451b44SJordan Rupprecht thread.IsValid(), 8499451b44SJordan Rupprecht "There should be a thread stopped due to breakpoint") 8599451b44SJordan Rupprecht 8699451b44SJordan Rupprecht frame0 = thread.GetFrameAtIndex(0) 8799451b44SJordan Rupprecht location1 = breakpoint.FindLocationByAddress(frame0.GetPC()) 880ed758b2SDave Lee self.assertEqual( 890ed758b2SDave Lee frame0.GetLineEntry().GetLine(), self.a_int_body_line_no, 9099451b44SJordan Rupprecht "Stopped in int a(int)") 9199451b44SJordan Rupprecht self.assertTrue(location1) 9299451b44SJordan Rupprecht self.assertEqual(location1.GetHitCount(), 1) 9399451b44SJordan Rupprecht self.assertEqual(breakpoint.GetHitCount(), 1) 9499451b44SJordan Rupprecht 9599451b44SJordan Rupprecht process.Continue() 9699451b44SJordan Rupprecht 9799451b44SJordan Rupprecht # Verify 2nd breakpoint location is hit. 9899451b44SJordan Rupprecht thread = get_stopped_thread(process, lldb.eStopReasonBreakpoint) 9999451b44SJordan Rupprecht self.assertTrue( 10099451b44SJordan Rupprecht thread.IsValid(), 10199451b44SJordan Rupprecht "There should be a thread stopped due to breakpoint") 10299451b44SJordan Rupprecht 10399451b44SJordan Rupprecht frame0 = thread.GetFrameAtIndex(0) 10499451b44SJordan Rupprecht location2 = breakpoint.FindLocationByAddress(frame0.GetPC()) 1050ed758b2SDave Lee self.assertEqual( 1060ed758b2SDave Lee frame0.GetLineEntry().GetLine(), self.a_float_body_line_no, 10799451b44SJordan Rupprecht "Stopped in float a(float)") 10899451b44SJordan Rupprecht self.assertTrue(location2) 10999451b44SJordan Rupprecht self.assertEqual(location2.GetHitCount(), 1) 11099451b44SJordan Rupprecht self.assertEqual(location1.GetHitCount(), 1) 11199451b44SJordan Rupprecht self.assertEqual(breakpoint.GetHitCount(), 2) 11299451b44SJordan Rupprecht 11399451b44SJordan Rupprecht process.Continue() 11499451b44SJordan Rupprecht 11599451b44SJordan Rupprecht # Verify 2nd breakpoint location is hit again. 11699451b44SJordan Rupprecht thread = get_stopped_thread(process, lldb.eStopReasonBreakpoint) 11799451b44SJordan Rupprecht self.assertTrue( 11899451b44SJordan Rupprecht thread.IsValid(), 11999451b44SJordan Rupprecht "There should be a thread stopped due to breakpoint") 12099451b44SJordan Rupprecht 12199451b44SJordan Rupprecht self.assertEqual(location2.GetHitCount(), 2) 12299451b44SJordan Rupprecht self.assertEqual(location1.GetHitCount(), 1) 12399451b44SJordan Rupprecht self.assertEqual(breakpoint.GetHitCount(), 3) 12499451b44SJordan Rupprecht 12599451b44SJordan Rupprecht process.Continue() 126