| import lldb | |
| from lldbsuite.test.decorators import * | |
| from lldbsuite.test.lldbtest import * | |
| from lldbsuite.test import lldbutil | |
| class TestCase(TestBase): | |
| @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.assertSuccess(err) | |
| # Test that we hit the breakpoint after dlopen. | |
| lldbutil.run_to_breakpoint_do_run(self, self.target(), breakpoint) |