jankratochvil created this revision.
jankratochvil added reviewers: labath, clayborg.
Herald added a subscriber: aprantl.

I have found LLDB cannot find separate debug info of Fedora /usr/bin/gdb.  It 
is because:

  lrwxrwxrwx 1 root root       14 Jan 25 20:41 /usr/bin/gdb -> ../libexec/gdb*
  -rwxr-xr-x 1 root root 10180296 Jan 25 20:41 /usr/libexec/gdb*
  ls: cannot access '/usr/lib/debug/usr/bin/gdb-8.0.1-35.fc27.x86_64.debug': No 
such file or directory
  -r--r--r-- 1 root root 29200464 Jan 25 20:41 
/usr/lib/debug/usr/libexec/gdb-8.0.1-35.fc27.x86_64.debug

FYI that `-8.0.1-35.fc27.x86_64.debug` may look confusing, it was always just 
`.debug` before.
Why is `/usr/bin/gdb` a symlink is offtopic for this bugreport, Fedora has it 
so for some reasons.

It is always safest to look at the .debug file only after resolving all 
symlinks on the binary file.  I hope it should not cause any regressions.


https://reviews.llvm.org/D42853

Files:
  packages/Python/lldbsuite/test/linux/sepdebugsymlink/Makefile
  
packages/Python/lldbsuite/test/linux/sepdebugsymlink/TestSymbolsSepDebugSymlink.py
  packages/Python/lldbsuite/test/linux/sepdebugsymlink/main.c
  source/Host/common/Symbols.cpp

Index: source/Host/common/Symbols.cpp
===================================================================
--- source/Host/common/Symbols.cpp
+++ source/Host/common/Symbols.cpp
@@ -9,6 +9,7 @@
 
 #include "lldb/Host/Symbols.h"
 #include "lldb/Core/ModuleSpec.h"
+#include "lldb/Host/FileSystem.h"
 #include "lldb/Symbol/ObjectFile.h"
 #include "lldb/Target/Target.h"
 #include "lldb/Utility/ArchSpec.h"
@@ -221,7 +222,11 @@
         Target::GetDefaultDebugFileSearchPaths());
 
     // Add module directory.
-    const ConstString &file_dir = module_spec.GetFileSpec().GetDirectory();
+    FileSpec module_file_spec = module_spec.GetFileSpec();
+    // We keep the unresolved pathname if it fails.
+    FileSystem::ResolveSymbolicLink(module_file_spec, module_file_spec);
+
+    const ConstString &file_dir = module_file_spec.GetDirectory();
     debug_file_search_paths.AppendIfUnique(
         FileSpec(file_dir.AsCString("."), true));
 
@@ -274,7 +279,7 @@
         FileSpec file_spec(filename, true);
 
         if (llvm::sys::fs::equivalent(file_spec.GetPath(),
-                                      module_spec.GetFileSpec().GetPath()))
+                                      module_file_spec.GetPath()))
           continue;
 
         if (file_spec.Exists()) {
Index: packages/Python/lldbsuite/test/linux/sepdebugsymlink/main.c
===================================================================
--- /dev/null
+++ packages/Python/lldbsuite/test/linux/sepdebugsymlink/main.c
@@ -0,0 +1,3 @@
+int main() {
+  return 0;
+}
Index: packages/Python/lldbsuite/test/linux/sepdebugsymlink/TestSymbolsSepDebugSymlink.py
===================================================================
--- /dev/null
+++ packages/Python/lldbsuite/test/linux/sepdebugsymlink/TestSymbolsSepDebugSymlink.py
@@ -0,0 +1,42 @@
+""" Testing separate debug info loading for base binary with a symlink. """
+import os
+import time
+import lldb
+import sys
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+
+class TestSymbolsSepDebugSymlink(TestBase):
+
+    mydir = TestBase.compute_mydir(__file__)
+
+    def setUp(self):
+        TestBase.setUp(self)
+        self.source = 'main.c'
+
+    @no_debug_info_test  # Prevent the genaration of the dwarf version of this test
+    @skipUnlessPlatform(['linux'])
+    def test_sepdebug_symlink_case(self):
+        self.build(clean=True)
+        exe = self.getBuildArtifact("dirsymlink/stripped.symlink")
+
+        self.target = self.dbg.CreateTarget(exe)
+        self.assertTrue(self.target, VALID_TARGET)
+
+        main_bp = self.target.BreakpointCreateByName("main", "stripped.symlink")
+        self.assertTrue(main_bp, VALID_BREAKPOINT)
+
+        self.process = self.target.LaunchSimple(
+            None, None, self.get_process_working_directory())
+        self.assertTrue(self.process, PROCESS_IS_VALID)
+
+        # The stop reason of the thread should be breakpoint.
+        self.assertTrue(self.process.GetState() == lldb.eStateStopped,
+                        STOPPED_DUE_TO_BREAKPOINT)
+
+        exe_module = self.target.GetModuleAtIndex(0)
+
+        # Check that symbols are now loaded and main.c is in the output.
+        self.expect("frame select", substrs=['main.c'])
Index: packages/Python/lldbsuite/test/linux/sepdebugsymlink/Makefile
===================================================================
--- /dev/null
+++ packages/Python/lldbsuite/test/linux/sepdebugsymlink/Makefile
@@ -0,0 +1,20 @@
+LEVEL = ../../make
+CXX_SOURCES := main.cpp
+
+localall: dirsymlink
+
+dirreal: a.out
+	$(RM) -r $@
+	mkdir $@
+	$(OBJCOPY) --only-keep-debug $< $@/stripped.debug
+	$(OBJCOPY) --strip-all --add-gnu-debuglink=$@/stripped.debug $< $@/stripped.out
+
+dirsymlink: dirreal
+	$(RM) -r $@
+	mkdir $@
+	ln -s ../$</stripped.out $@/stripped.symlink
+
+clean::
+	$(RM) -r dirreal dirsymlink
+
+include $(LEVEL)/Makefile.rules
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to