| """ | |
| When using C++11 in place member initialization, show that we | |
| can set and hit breakpoints on initialization lines. This is a | |
| little bit tricky because we try not to move file and line breakpoints | |
| across function boundaries but these lines are outside the source range | |
| of the constructor. | |
| """ | |
| import lldb | |
| import lldbsuite.test.lldbutil as lldbutil | |
| from lldbsuite.test.lldbtest import * | |
| class TestCase(TestBase): | |
| def test_breakpoints_on_initializers(self): | |
| """Show we can set breakpoints on initializers appearing both before | |
| and after the constructor body, and hit them.""" | |
| self.build() | |
| self.main_source_file = lldb.SBFileSpec("main.cpp") | |
| self.first_initializer_line = line_number( | |
| "main.cpp", "Set the before constructor breakpoint here" | |
| ) | |
| self.second_initializer_line = line_number( | |
| "main.cpp", "Set the after constructor breakpoint here" | |
| ) | |
| (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint( | |
| self, " Set a breakpoint here to get started", self.main_source_file | |
| ) | |
| # Now set breakpoints on the two initializer lines we found in the test startup: | |
| bkpt1 = target.BreakpointCreateByLocation( | |
| self.main_source_file, self.first_initializer_line | |
| ) | |
| self.assertEqual(bkpt1.GetNumLocations(), 1) | |
| bkpt2 = target.BreakpointCreateByLocation( | |
| self.main_source_file, self.second_initializer_line | |
| ) | |
| self.assertEqual(bkpt2.GetNumLocations(), 1) | |
| # Now continue, we should stop at the two breakpoints above, first the one before, then | |
| # the one after. | |
| self.assertEqual( | |
| len(lldbutil.continue_to_breakpoint(process, bkpt1)), | |
| 1, | |
| "Hit first breakpoint", | |
| ) | |
| self.assertEqual( | |
| len(lldbutil.continue_to_breakpoint(process, bkpt2)), | |
| 1, | |
| "Hit second breakpoint", | |
| ) |