| import lldb |
| from lldbsuite.test.decorators import * |
| from lldbsuite.test.lldbtest import * |
| from lldbsuite.test import lldbutil |
| |
| class TestCase(TestBase): |
| |
| mydir = TestBase.compute_mydir(__file__) |
| |
| @skipIfRemote |
| @skipIfWindows |
| # glibc's dlopen doesn't support opening executables. |
| # https://sourceware.org/bugzilla/show_bug.cgi?id=11754 |
| @skipIfLinux |
| # freebsd's dlopen ditto |
| @expectedFailureAll(oslist=["freebsd"]) |
| @expectedFailureNetBSD |
| @no_debug_info_test |
| def test(self): |
| self.build() |
| # Launch and stop before the dlopen call. |
| lldbutil.run_to_source_breakpoint(self, "// break here", lldb.SBFileSpec("main.c")) |
| |
| # Delete the breakpoint we no longer need. |
| self.target().DeleteAllBreakpoints() |
| |
| # Check that the executable is the test binary. |
| self.assertEqual(self.target().GetExecutable().GetFilename(), "a.out") |
| |
| # Continue so that dlopen is called. |
| breakpoint = self.target().BreakpointCreateBySourceRegex( |
| "// break after dlopen", lldb.SBFileSpec("main.c")) |
| self.assertNotEqual(breakpoint.GetNumResolvedLocations(), 0) |
| stopped_threads = lldbutil.continue_to_breakpoint(self.process(), breakpoint) |
| self.assertEqual(len(stopped_threads), 1) |
| |
| # Check that the executable is still the test binary and not "other". |
| self.assertEqual(self.target().GetExecutable().GetFilename(), "a.out") |
| |
| # Kill the process and run the program again. |
| err = self.process().Kill() |
| self.assertTrue(err.Success(), str(err)) |
| |
| # Test that we hit the breakpoint after dlopen. |
| lldbutil.run_to_breakpoint_do_run(self, self.target(), breakpoint) |