1*99451b44SJordan Rupprecht""" 2*99451b44SJordan RupprechtTest lldb breakpoint setting by source regular expression. 3*99451b44SJordan RupprechtThis test just tests the source file & function restrictions. 4*99451b44SJordan Rupprecht""" 5*99451b44SJordan Rupprecht 6*99451b44SJordan Rupprecht 7*99451b44SJordan Rupprechtimport lldb 8*99451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 9*99451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 10*99451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 11*99451b44SJordan Rupprecht 12*99451b44SJordan Rupprecht 13*99451b44SJordan Rupprechtclass TestSourceRegexBreakpoints(TestBase): 14*99451b44SJordan Rupprecht 15*99451b44SJordan Rupprecht mydir = TestBase.compute_mydir(__file__) 16*99451b44SJordan Rupprecht 17*99451b44SJordan Rupprecht def test_location(self): 18*99451b44SJordan Rupprecht self.build() 19*99451b44SJordan Rupprecht self.source_regex_locations() 20*99451b44SJordan Rupprecht 21*99451b44SJordan Rupprecht def test_restrictions(self): 22*99451b44SJordan Rupprecht self.build() 23*99451b44SJordan Rupprecht self.source_regex_restrictions() 24*99451b44SJordan Rupprecht 25*99451b44SJordan Rupprecht def source_regex_locations(self): 26*99451b44SJordan Rupprecht """ Test that restricting source expressions to files & to functions. """ 27*99451b44SJordan Rupprecht # Create a target by the debugger. 28*99451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 29*99451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 30*99451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 31*99451b44SJordan Rupprecht 32*99451b44SJordan Rupprecht # First look just in main: 33*99451b44SJordan Rupprecht target_files = lldb.SBFileSpecList() 34*99451b44SJordan Rupprecht target_files.Append(lldb.SBFileSpec("a.c")) 35*99451b44SJordan Rupprecht 36*99451b44SJordan Rupprecht func_names = lldb.SBStringList() 37*99451b44SJordan Rupprecht func_names.AppendString("a_func") 38*99451b44SJordan Rupprecht 39*99451b44SJordan Rupprecht source_regex = "Set . breakpoint here" 40*99451b44SJordan Rupprecht main_break = target.BreakpointCreateBySourceRegex( 41*99451b44SJordan Rupprecht source_regex, lldb.SBFileSpecList(), target_files, func_names) 42*99451b44SJordan Rupprecht num_locations = main_break.GetNumLocations() 43*99451b44SJordan Rupprecht self.assertTrue( 44*99451b44SJordan Rupprecht num_locations == 1, 45*99451b44SJordan Rupprecht "a.c in a_func should give one breakpoint, got %d." % 46*99451b44SJordan Rupprecht (num_locations)) 47*99451b44SJordan Rupprecht 48*99451b44SJordan Rupprecht loc = main_break.GetLocationAtIndex(0) 49*99451b44SJordan Rupprecht self.assertTrue(loc.IsValid(), "Got a valid location.") 50*99451b44SJordan Rupprecht address = loc.GetAddress() 51*99451b44SJordan Rupprecht self.assertTrue( 52*99451b44SJordan Rupprecht address.IsValid(), 53*99451b44SJordan Rupprecht "Got a valid address from the location.") 54*99451b44SJordan Rupprecht 55*99451b44SJordan Rupprecht a_func_line = line_number("a.c", "Set A breakpoint here") 56*99451b44SJordan Rupprecht line_entry = address.GetLineEntry() 57*99451b44SJordan Rupprecht self.assertTrue(line_entry.IsValid(), "Got a valid line entry.") 58*99451b44SJordan Rupprecht self.assertTrue(line_entry.line == a_func_line, 59*99451b44SJordan Rupprecht "Our line number matches the one lldbtest found.") 60*99451b44SJordan Rupprecht 61*99451b44SJordan Rupprecht def source_regex_restrictions(self): 62*99451b44SJordan Rupprecht """ Test that restricting source expressions to files & to functions. """ 63*99451b44SJordan Rupprecht # Create a target by the debugger. 64*99451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 65*99451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 66*99451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 67*99451b44SJordan Rupprecht 68*99451b44SJordan Rupprecht # First look just in main: 69*99451b44SJordan Rupprecht target_files = lldb.SBFileSpecList() 70*99451b44SJordan Rupprecht target_files.Append(lldb.SBFileSpec("main.c")) 71*99451b44SJordan Rupprecht source_regex = "Set . breakpoint here" 72*99451b44SJordan Rupprecht main_break = target.BreakpointCreateBySourceRegex( 73*99451b44SJordan Rupprecht source_regex, lldb.SBFileSpecList(), target_files, lldb.SBStringList()) 74*99451b44SJordan Rupprecht 75*99451b44SJordan Rupprecht num_locations = main_break.GetNumLocations() 76*99451b44SJordan Rupprecht self.assertTrue( 77*99451b44SJordan Rupprecht num_locations == 2, 78*99451b44SJordan Rupprecht "main.c should have 2 matches, got %d." % 79*99451b44SJordan Rupprecht (num_locations)) 80*99451b44SJordan Rupprecht 81*99451b44SJordan Rupprecht # Now look in both files: 82*99451b44SJordan Rupprecht target_files.Append(lldb.SBFileSpec("a.c")) 83*99451b44SJordan Rupprecht 84*99451b44SJordan Rupprecht main_break = target.BreakpointCreateBySourceRegex( 85*99451b44SJordan Rupprecht source_regex, lldb.SBFileSpecList(), target_files, lldb.SBStringList()) 86*99451b44SJordan Rupprecht 87*99451b44SJordan Rupprecht num_locations = main_break.GetNumLocations() 88*99451b44SJordan Rupprecht self.assertTrue( 89*99451b44SJordan Rupprecht num_locations == 4, 90*99451b44SJordan Rupprecht "main.c and a.c should have 4 matches, got %d." % 91*99451b44SJordan Rupprecht (num_locations)) 92*99451b44SJordan Rupprecht 93*99451b44SJordan Rupprecht # Now restrict it to functions: 94*99451b44SJordan Rupprecht func_names = lldb.SBStringList() 95*99451b44SJordan Rupprecht func_names.AppendString("main_func") 96*99451b44SJordan Rupprecht main_break = target.BreakpointCreateBySourceRegex( 97*99451b44SJordan Rupprecht source_regex, lldb.SBFileSpecList(), target_files, func_names) 98*99451b44SJordan Rupprecht 99*99451b44SJordan Rupprecht num_locations = main_break.GetNumLocations() 100*99451b44SJordan Rupprecht self.assertTrue( 101*99451b44SJordan Rupprecht num_locations == 2, 102*99451b44SJordan Rupprecht "main_func in main.c and a.c should have 2 matches, got %d." % 103*99451b44SJordan Rupprecht (num_locations)) 104