summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Tremoulet <jotrem@microsoft.com>2020-09-23 06:00:50 -0700
committerTom Stellard <tstellar@redhat.com>2020-12-11 17:17:24 -0500
commit561e1ce1a82e98df60074cef6b63f640f4ef712c (patch)
treec1c7f9612340bf3d26e5de11e3af129a36a243dc
parent852f4d8eb6d317be0947055c0bb6b4fd6c9aa930 (diff)
downloadllvm-561e1ce1a82e98df60074cef6b63f640f4ef712c.tar.gz
[lldb] Fix GetRemoteSharedModule fallback logic
When the various methods of locating the module in GetRemoteSharedModule fail, make sure we pass the original module spec to the bail-out call to the provided resolver function. Also make sure we consistently use the resolved module spec from the various success paths. Thanks to what appears to have been an accidentally inverted condition (commit 85967fa applied the new condition to a path where GetModuleSpec returns false, but should have applied it when GetModuleSpec returns true), without this fix we only pass the original module spec in the fallback if the original spec has no uuid (or has a uuid that somehow matches the resolved module's uuid despite the call to GetModuleSpec failing). This manifested as a bug when processing a minidump file with a user-provided sysroot, since in that case the resolver call was being applied to resolved_module_spec (despite resolution failing), which did not have the path of its file_spec set. Reviewed By: JDevlieghere Differential Revision: https://reviews.llvm.org/D88099 (cherry picked from commit 20f84257ac4ac54ceb5f581a6081fac6eff2a5a1)
-rw-r--r--lldb/source/Target/Platform.cpp16
-rw-r--r--lldb/test/API/functionalities/postmortem/minidump-new/TestMiniDumpNew.py26
2 files changed, 38 insertions, 4 deletions
diff --git a/lldb/source/Target/Platform.cpp b/lldb/source/Target/Platform.cpp
index 16787141bee0..34ed7872c720 100644
--- a/lldb/source/Target/Platform.cpp
+++ b/lldb/source/Target/Platform.cpp
@@ -1564,21 +1564,29 @@ Status Platform::GetRemoteSharedModule(const ModuleSpec &module_spec,
if (error.Success() && module_sp)
break;
}
- if (module_sp)
+ if (module_sp) {
+ resolved_module_spec = arch_module_spec;
got_module_spec = true;
+ }
}
if (!got_module_spec) {
// Get module information from a target.
- if (!GetModuleSpec(module_spec.GetFileSpec(), module_spec.GetArchitecture(),
- resolved_module_spec)) {
+ if (GetModuleSpec(module_spec.GetFileSpec(), module_spec.GetArchitecture(),
+ resolved_module_spec)) {
if (!module_spec.GetUUID().IsValid() ||
module_spec.GetUUID() == resolved_module_spec.GetUUID()) {
- return module_resolver(module_spec);
+ got_module_spec = true;
}
}
}
+ if (!got_module_spec) {
+ // Fall back to the given module resolver, which may have its own
+ // search logic.
+ return module_resolver(module_spec);
+ }
+
// If we are looking for a specific UUID, make sure resolved_module_spec has
// the same one before we search.
if (module_spec.GetUUID().IsValid()) {
diff --git a/lldb/test/API/functionalities/postmortem/minidump-new/TestMiniDumpNew.py b/lldb/test/API/functionalities/postmortem/minidump-new/TestMiniDumpNew.py
index 012f9b67d9e3..9d2daec67698 100644
--- a/lldb/test/API/functionalities/postmortem/minidump-new/TestMiniDumpNew.py
+++ b/lldb/test/API/functionalities/postmortem/minidump-new/TestMiniDumpNew.py
@@ -455,3 +455,29 @@ class MiniDumpNewTestCase(TestBase):
check_region(17, 0x40169000, 0x4016b000, True, True, False, True, d)
check_region(18, 0x4016b000, 0x40176000, True, True, False, True, n)
check_region(-1, 0x40176000, max_int, False, False, False, False, n)
+
+ @skipIfLLVMTargetMissing("X86")
+ def test_minidump_sysroot(self):
+ """Test that lldb can find a module referenced in an i386 linux minidump using the sysroot."""
+
+ # Copy linux-x86_64 executable to tmp_sysroot/temp/test/ (since it was compiled as
+ # /tmp/test/linux-x86_64)
+ tmp_sysroot = os.path.join(
+ self.getBuildDir(), "lldb_i386_mock_sysroot")
+ executable = os.path.join(
+ tmp_sysroot, "tmp", "test", "linux-x86_64")
+ exe_dir = os.path.dirname(executable)
+ lldbutil.mkdir_p(exe_dir)
+ shutil.copyfile("linux-x86_64", executable)
+
+ # Set sysroot and load core
+ self.runCmd("platform select remote-linux --sysroot '%s'" %
+ tmp_sysroot)
+ self.process_from_yaml("linux-x86_64.yaml")
+ self.check_state()
+
+ # Check that we loaded the module from the sysroot
+ self.assertEqual(self.target.GetNumModules(), 1)
+ module = self.target.GetModuleAtIndex(0)
+ spec = module.GetFileSpec()
+ self.assertEqual(spec.GetDirectory(), exe_dir)