diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2019-08-20 18:01:57 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2019-08-20 18:01:57 +0000 |
| commit | 88c643b6fec27eec436c8d138fee6346e92337d6 (patch) | |
| tree | 82cd13b2f3cde1c9e5f79689ba4e6ba67694843f /packages/Python/lldbsuite/test/functionalities/load_unload/TestLoadUnload.py | |
| parent | 94994d372d014ce4c8758b9605d63fae651bd8aa (diff) | |
Notes
Diffstat (limited to 'packages/Python/lldbsuite/test/functionalities/load_unload/TestLoadUnload.py')
| -rw-r--r-- | packages/Python/lldbsuite/test/functionalities/load_unload/TestLoadUnload.py | 406 |
1 files changed, 0 insertions, 406 deletions
diff --git a/packages/Python/lldbsuite/test/functionalities/load_unload/TestLoadUnload.py b/packages/Python/lldbsuite/test/functionalities/load_unload/TestLoadUnload.py deleted file mode 100644 index 7bc5d205a94f8..0000000000000 --- a/packages/Python/lldbsuite/test/functionalities/load_unload/TestLoadUnload.py +++ /dev/null @@ -1,406 +0,0 @@ -""" -Test that breakpoint by symbol name works correctly with dynamic libs. -""" - -from __future__ import print_function - - -import os -import time -import re -import lldb -from lldbsuite.test.decorators import * -from lldbsuite.test.lldbtest import * -from lldbsuite.test import lldbutil - - -@skipIfWindows # Windows doesn't have dlopen and friends, dynamic libraries work differently -class LoadUnloadTestCase(TestBase): - - mydir = TestBase.compute_mydir(__file__) - - NO_DEBUG_INFO_TESTCASE = True - - def setUp(self): - # Call super's setUp(). - TestBase.setUp(self) - self.setup_test() - # Invoke the default build rule. - self.build() - # Find the line number to break for main.cpp. - self.line = line_number( - 'main.cpp', - '// Set break point at this line for test_lldb_process_load_and_unload_commands().') - self.line_d_function = line_number( - 'd.cpp', '// Find this line number within d_dunction().') - - def setup_test(self): - lldbutil.mkdir_p(self.getBuildArtifact("hidden")) - if not self.platformIsDarwin(): - if not lldb.remote_platform and "LD_LIBRARY_PATH" in os.environ: - self.runCmd( - "settings set target.env-vars " + - self.dylibPath + - "=" + - os.environ["LD_LIBRARY_PATH"] + - ":" + - self.getBuildDir()) - else: - if lldb.remote_platform: - wd = lldb.remote_platform.GetWorkingDirectory() - else: - wd = self.getBuildDir() - self.runCmd( - "settings set target.env-vars " + - self.dylibPath + - "=" + - wd) - - def copy_shlibs_to_remote(self, hidden_dir=False): - """ Copies the shared libs required by this test suite to remote. - Does nothing in case of non-remote platforms. - """ - if lldb.remote_platform: - ext = 'so' - if self.platformIsDarwin(): - ext = 'dylib' - - shlibs = ['libloadunload_a.' + ext, 'libloadunload_b.' + ext, - 'libloadunload_c.' + ext, 'libloadunload_d.' + ext] - wd = lldb.remote_platform.GetWorkingDirectory() - cwd = os.getcwd() - for f in shlibs: - err = lldb.remote_platform.Put( - lldb.SBFileSpec(self.getBuildArtifact(f)), - lldb.SBFileSpec(os.path.join(wd, f))) - if err.Fail(): - raise RuntimeError( - "Unable copy '%s' to '%s'.\n>>> %s" % - (f, wd, err.GetCString())) - if hidden_dir: - shlib = 'libloadunload_d.' + ext - hidden_dir = os.path.join(wd, 'hidden') - hidden_file = os.path.join(hidden_dir, shlib) - err = lldb.remote_platform.MakeDirectory(hidden_dir) - if err.Fail(): - raise RuntimeError( - "Unable to create a directory '%s'." % hidden_dir) - err = lldb.remote_platform.Put( - lldb.SBFileSpec(os.path.join('hidden', shlib)), - lldb.SBFileSpec(hidden_file)) - if err.Fail(): - raise RuntimeError( - "Unable copy 'libloadunload_d.so' to '%s'.\n>>> %s" % - (wd, err.GetCString())) - - # libloadunload_d.so does not appear in the image list because executable - # dependencies are resolved relative to the debuggers PWD. Bug? - @expectedFailureAll(oslist=["linux"]) - @skipIfFreeBSD # llvm.org/pr14424 - missing FreeBSD Makefiles/testcase support - @not_remote_testsuite_ready - @skipIfWindows # Windows doesn't have dlopen and friends, dynamic libraries work differently - def test_modules_search_paths(self): - """Test target modules list after loading a different copy of the library libd.dylib, and verifies that it works with 'target modules search-paths add'.""" - if self.platformIsDarwin(): - dylibName = 'libloadunload_d.dylib' - else: - dylibName = 'libloadunload_d.so' - - # The directory with the dynamic library we did not link to. - new_dir = os.path.join(self.getBuildDir(), "hidden") - - old_dylib = os.path.join(self.getBuildDir(), dylibName) - new_dylib = os.path.join(new_dir, dylibName) - exe = self.getBuildArtifact("a.out") - self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) - - self.expect("target modules list", - substrs=[old_dylib]) - # self.expect("target modules list -t 3", - # patterns = ["%s-[^-]*-[^-]*" % self.getArchitecture()]) - # Add an image search path substitution pair. - self.runCmd( - "target modules search-paths add %s %s" % - (self.getBuildDir(), new_dir)) - - self.expect("target modules search-paths list", - substrs=[self.getBuildDir(), new_dir]) - - self.expect( - "target modules search-paths query %s" % - self.getBuildDir(), - "Image search path successfully transformed", - substrs=[new_dir]) - - # Obliterate traces of libd from the old location. - os.remove(old_dylib) - # Inform (DY)LD_LIBRARY_PATH of the new path, too. - env_cmd_string = "settings set target.env-vars " + self.dylibPath + "=" + new_dir - if self.TraceOn(): - print("Set environment to: ", env_cmd_string) - self.runCmd(env_cmd_string) - self.runCmd("settings show target.env-vars") - - remove_dyld_path_cmd = "settings remove target.env-vars " + self.dylibPath - self.addTearDownHook( - lambda: self.dbg.HandleCommand(remove_dyld_path_cmd)) - - self.runCmd("run") - - self.expect( - "target modules list", - "LLDB successfully locates the relocated dynamic library", - substrs=[new_dylib]) - - # libloadunload_d.so does not appear in the image list because executable - # dependencies are resolved relative to the debuggers PWD. Bug? - @expectedFailureAll(oslist=["linux"]) - @skipIfFreeBSD # llvm.org/pr14424 - missing FreeBSD Makefiles/testcase support - @expectedFailureAndroid # wrong source file shows up for hidden library - @skipIfWindows # Windows doesn't have dlopen and friends, dynamic libraries work differently - @skipIfDarwinEmbedded - def test_dyld_library_path(self): - """Test (DY)LD_LIBRARY_PATH after moving libd.dylib, which defines d_function, somewhere else.""" - self.copy_shlibs_to_remote(hidden_dir=True) - - exe = self.getBuildArtifact("a.out") - self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) - - # Shut off ANSI color usage so we don't get ANSI escape sequences - # mixed in with stop locations. - self.dbg.SetUseColor(False) - - if self.platformIsDarwin(): - dylibName = 'libloadunload_d.dylib' - dsymName = 'libloadunload_d.dylib.dSYM' - else: - dylibName = 'libloadunload_d.so' - - # The directory to relocate the dynamic library and its debugging info. - special_dir = "hidden" - if lldb.remote_platform: - wd = lldb.remote_platform.GetWorkingDirectory() - else: - wd = self.getBuildDir() - - old_dir = wd - new_dir = os.path.join(wd, special_dir) - old_dylib = os.path.join(old_dir, dylibName) - - remove_dyld_path_cmd = "settings remove target.env-vars " \ - + self.dylibPath - self.addTearDownHook( - lambda: self.dbg.HandleCommand(remove_dyld_path_cmd)) - - # For now we don't track (DY)LD_LIBRARY_PATH, so the old - # library will be in the modules list. - self.expect("target modules list", - substrs=[os.path.basename(old_dylib)], - matching=True) - - lldbutil.run_break_set_by_file_and_line( - self, "d.cpp", self.line_d_function, num_expected_locations=1) - # After run, make sure the non-hidden library is picked up. - self.expect("run", substrs=["return", "700"]) - - self.runCmd("continue") - - # Add the hidden directory first in the search path. - env_cmd_string = ("settings set target.env-vars %s=%s" % - (self.dylibPath, new_dir)) - if not self.platformIsDarwin(): - env_cmd_string += ":" + wd - self.runCmd(env_cmd_string) - - # This time, the hidden library should be picked up. - self.expect("run", substrs=["return", "12345"]) - - @expectedFailureAll( - bugnumber="llvm.org/pr25805", - hostoslist=["windows"], - triple='.*-android') - @skipIfFreeBSD # llvm.org/pr14424 - missing FreeBSD Makefiles/testcase support - @skipIfWindows # Windows doesn't have dlopen and friends, dynamic libraries work differently - def test_lldb_process_load_and_unload_commands(self): - """Test that lldb process load/unload command work correctly.""" - self.copy_shlibs_to_remote() - - exe = self.getBuildArtifact("a.out") - self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) - - # Break at main.cpp before the call to dlopen(). - # Use lldb's process load command to load the dylib, instead. - - lldbutil.run_break_set_by_file_and_line( - self, "main.cpp", self.line, num_expected_locations=1, loc_exact=True) - - self.runCmd("run", RUN_SUCCEEDED) - - ctx = self.platformContext - dylibName = ctx.shlib_prefix + 'loadunload_a.' + ctx.shlib_extension - localDylibPath = self.getBuildArtifact(dylibName) - if lldb.remote_platform: - wd = lldb.remote_platform.GetWorkingDirectory() - remoteDylibPath = lldbutil.join_remote_paths(wd, dylibName) - else: - remoteDylibPath = localDylibPath - - # Make sure that a_function does not exist at this point. - self.expect( - "image lookup -n a_function", - "a_function should not exist yet", - error=True, - matching=False, - patterns=["1 match found"]) - - # Use lldb 'process load' to load the dylib. - self.expect( - "process load %s --install=%s" % (localDylibPath, remoteDylibPath), - "%s loaded correctly" % dylibName, - patterns=[ - 'Loading "%s".*ok' % localDylibPath, - 'Image [0-9]+ loaded']) - - # Search for and match the "Image ([0-9]+) loaded" pattern. - output = self.res.GetOutput() - pattern = re.compile("Image ([0-9]+) loaded") - for l in output.split(os.linesep): - #print("l:", l) - match = pattern.search(l) - if match: - break - index = match.group(1) - - # Now we should have an entry for a_function. - self.expect( - "image lookup -n a_function", - "a_function should now exist", - patterns=[ - "1 match found .*%s" % - dylibName]) - - # Use lldb 'process unload' to unload the dylib. - self.expect( - "process unload %s" % - index, - "%s unloaded correctly" % - dylibName, - patterns=[ - "Unloading .* with index %s.*ok" % - index]) - - self.runCmd("process continue") - - @skipIfFreeBSD # llvm.org/pr14424 - missing FreeBSD Makefiles/testcase support - def test_load_unload(self): - """Test breakpoint by name works correctly with dlopen'ing.""" - self.copy_shlibs_to_remote() - - exe = self.getBuildArtifact("a.out") - self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) - - # Break by function name a_function (not yet loaded). - lldbutil.run_break_set_by_symbol( - self, "a_function", num_expected_locations=0) - - self.runCmd("run", RUN_SUCCEEDED) - - # The stop reason of the thread should be breakpoint and at a_function. - self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, - substrs=['stopped', - 'a_function', - 'stop reason = breakpoint']) - - # The breakpoint should have a hit count of 1. - self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE, - substrs=[' resolved, hit count = 1']) - - # Issue the 'contnue' command. We should stop agaian at a_function. - # The stop reason of the thread should be breakpoint and at a_function. - self.runCmd("continue") - - # rdar://problem/8508987 - # The a_function breakpoint should be encountered twice. - self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, - substrs=['stopped', - 'a_function', - 'stop reason = breakpoint']) - - # The breakpoint should have a hit count of 2. - self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE, - substrs=[' resolved, hit count = 2']) - - @skipIfFreeBSD # llvm.org/pr14424 - missing FreeBSD Makefiles/testcase support - @skipIfWindows # Windows doesn't have dlopen and friends, dynamic libraries work differently - def test_step_over_load(self): - """Test stepping over code that loads a shared library works correctly.""" - self.copy_shlibs_to_remote() - - exe = self.getBuildArtifact("a.out") - self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) - - # Break by function name a_function (not yet loaded). - lldbutil.run_break_set_by_file_and_line( - self, "main.cpp", self.line, num_expected_locations=1, loc_exact=True) - - self.runCmd("run", RUN_SUCCEEDED) - - # The stop reason of the thread should be breakpoint and at a_function. - self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, - substrs=['stopped', - 'stop reason = breakpoint']) - - self.runCmd( - "thread step-over", - "Stepping over function that loads library") - - # The stop reason should be step end. - self.expect("thread list", "step over succeeded.", - substrs=['stopped', - 'stop reason = step over']) - - # We can't find a breakpoint location for d_init before launching because - # executable dependencies are resolved relative to the debuggers PWD. Bug? - @expectedFailureAll(oslist=["linux"]) - @skipIfFreeBSD # llvm.org/pr14424 - missing FreeBSD Makefiles/testcase support - @skipIfWindows # Windows doesn't have dlopen and friends, dynamic libraries work differently - def test_static_init_during_load(self): - """Test that we can set breakpoints correctly in static initializers""" - self.copy_shlibs_to_remote() - - exe = self.getBuildArtifact("a.out") - self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) - - a_init_bp_num = lldbutil.run_break_set_by_symbol( - self, "a_init", num_expected_locations=0) - b_init_bp_num = lldbutil.run_break_set_by_symbol( - self, "b_init", num_expected_locations=0) - d_init_bp_num = lldbutil.run_break_set_by_symbol( - self, "d_init", num_expected_locations=1) - - self.runCmd("run", RUN_SUCCEEDED) - - self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, - substrs=['stopped', - 'd_init', - 'stop reason = breakpoint %d' % d_init_bp_num]) - - self.runCmd("continue") - self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, - substrs=['stopped', - 'b_init', - 'stop reason = breakpoint %d' % b_init_bp_num]) - self.expect("thread backtrace", - substrs=['b_init', - 'dlopen', - 'main']) - - self.runCmd("continue") - self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, - substrs=['stopped', - 'a_init', - 'stop reason = breakpoint %d' % a_init_bp_num]) - self.expect("thread backtrace", - substrs=['a_init', - 'dlopen', - 'main']) |
