| """ |
| 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", |
| ) |