Files
clang-p2996/lldb/test/API/functionalities/dlopen_other_executable/TestDlopenOtherExecutable.py
Raphael Isemann 16926115ed [lldb] Only set the executable module for a target once
Summary:

When we try to find the executable module for our target we don't check
if we already have an executable module set. This causes that when debugging
a program that dlopens another executable, LLDB will take that other executable
as the new executable of the target (which causes that future launches of the
target will launch the dlopen'd executable instead of the original executable).

This just adds a check that we only set the executable when we haven't already
found one.

Fixes rdar://63443099

Reviewers: jasonmolenda, jingham, teemperor

Reviewed By: jasonmolenda, teemperor

Subscribers: jingham, JDevlieghere

Differential Revision: https://reviews.llvm.org/D80724
2020-07-17 08:35:38 +02:00

43 lines
1.6 KiB
Python

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
@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)