| import lldb |
| from lldbsuite.test.decorators import * |
| from lldbsuite.test.lldbtest import * |
| from lldbsuite.test import lldbutil |
| |
| |
| class TestBreakInLoadedDylib(TestBase): |
| """Test that we can set a source regex breakpoint that will take in |
| a dlopened library that hasn't loaded when we set the breakpoint.""" |
| |
| NO_DEBUG_INFO_TESTCASE = True |
| |
| @skipIfRemote |
| def common_setup(self): |
| self.build() |
| ctx = self.platformContext |
| self.main_spec = lldb.SBFileSpec("main.cpp") |
| self.b_spec = lldb.SBFileSpec("b.cpp") |
| self.lib_shortname = "lib_b" |
| self.lib_fullname = ( |
| ctx.shlib_prefix + self.lib_shortname + "." + ctx.shlib_extension |
| ) |
| self.lib_spec = lldb.SBFileSpec(self.lib_fullname) |
| |
| def test_break_in_dlopen_dylib_using_lldbutils(self): |
| self.common_setup() |
| lldbutil.run_to_source_breakpoint( |
| self, |
| "Break here in dylib", |
| self.b_spec, |
| bkpt_module=self.lib_fullname, |
| extra_images=[self.lib_shortname], |
| has_locations_before_run=False, |
| ) |
| |
| @skipIfRemote |
| def test_break_in_dlopen_dylib_using_target(self): |
| self.common_setup() |
| |
| target, process, _, _ = lldbutil.run_to_source_breakpoint( |
| self, |
| "Break here before we dlopen", |
| self.main_spec, |
| extra_images=[self.lib_shortname], |
| ) |
| |
| # Now set some breakpoints that won't take till the library is loaded: |
| # This one is currently how lldbutils does it but test here in case that changes: |
| bkpt1 = target.BreakpointCreateBySourceRegex( |
| "Break here in dylib", self.b_spec, self.lib_fullname |
| ) |
| |
| # Try the file list API as well. Put in some bogus entries too, to make sure those |
| # don't trip us up: |
| |
| files_list = lldb.SBFileSpecList() |
| files_list.Append(self.b_spec) |
| files_list.Append(self.main_spec) |
| files_list.Append(lldb.SBFileSpec("I_bet_nobody_has_this_file.cpp")) |
| |
| modules_list = lldb.SBFileSpecList() |
| modules_list.Append(self.lib_spec) |
| modules_list.Append(lldb.SBFileSpec("libI_bet_not_this_one_either.dylib")) |
| |
| bkpt2 = target.BreakpointCreateBySourceRegex( |
| "Break here in dylib", modules_list, files_list |
| ) |
| |
| lldbutil.continue_to_breakpoint(process, bkpt1) |
| self.assertEqual(bkpt1.GetHitCount(), 1, "Hit breakpoint 1") |
| self.assertEqual(bkpt2.GetHitCount(), 1, "Hit breakpoint 2") |