[Lldb-commits] [lldb] r339833 - Fix a little thinko in generating ___lldb_unnamed_symbol symbols

Jim Ingham via lldb-commits lldb-commits at lists.llvm.org
Wed Aug 15 16:10:32 PDT 2018


Author: jingham
Date: Wed Aug 15 16:10:32 2018
New Revision: 339833

URL: http://llvm.org/viewvc/llvm-project?rev=339833&view=rev
Log:
Fix a little thinko in generating ___lldb_unnamed_symbol symbols 
when we have only an in-memory copy of the binary.

Also added a test for the generation of these symbols in the 
in-memory and regular cases.

<rdar://problem/43160401>

Added:
    lldb/trunk/packages/Python/lldbsuite/test/macosx/function-starts/
    lldb/trunk/packages/Python/lldbsuite/test/macosx/function-starts/Makefile
    lldb/trunk/packages/Python/lldbsuite/test/macosx/function-starts/TestFunctionStarts.py
    lldb/trunk/packages/Python/lldbsuite/test/macosx/function-starts/main.cpp
Modified:
    lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp

Added: lldb/trunk/packages/Python/lldbsuite/test/macosx/function-starts/Makefile
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/macosx/function-starts/Makefile?rev=339833&view=auto
==============================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/macosx/function-starts/Makefile (added)
+++ lldb/trunk/packages/Python/lldbsuite/test/macosx/function-starts/Makefile Wed Aug 15 16:10:32 2018
@@ -0,0 +1,10 @@
+LEVEL = ../../make
+
+CXX_SOURCES := main.cpp
+EXE := StripMe
+MAKE_DSYM := NO
+
+include $(LEVEL)/Makefile.rules
+
+main.o: main.cpp
+	$(CC) $(CFLAGS_NO_DEBUG) -c $< -o $@

Added: lldb/trunk/packages/Python/lldbsuite/test/macosx/function-starts/TestFunctionStarts.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/macosx/function-starts/TestFunctionStarts.py?rev=339833&view=auto
==============================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/macosx/function-starts/TestFunctionStarts.py (added)
+++ lldb/trunk/packages/Python/lldbsuite/test/macosx/function-starts/TestFunctionStarts.py Wed Aug 15 16:10:32 2018
@@ -0,0 +1,76 @@
+"""
+Test that we read the function starts section.
+"""
+
+from __future__ import print_function
+
+
+import os
+import time
+import lldb
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+exe_name = "StripMe"  # Must match Makefile
+
+class FunctionStartsTestCase(TestBase):
+
+    mydir = TestBase.compute_mydir(__file__)
+
+    NO_DEBUG_INFO_TESTCASE = True
+
+    @skipIfRemote
+    @skipUnlessDarwin
+    def test_function_starts_binary(self):
+        """Test that we make synthetic symbols when we have the binary."""
+        self.build()
+        self.do_function_starts(False)
+
+    @skipIfRemote
+    @skipUnlessDarwin
+    def test_function_starts_no_binary(self):
+        """Test that we make synthetic symbols when we don't have the binary"""
+        self.build()
+        self.do_function_starts(True)
+
+    def do_function_starts(self, in_memory):
+        """Run the binary, stop at our unstripped function, 
+           make sure the caller has synthetic symbols"""
+
+        exe = self.getBuildArtifact(exe_name)
+        # Now strip the binary, but leave externals so we can break on dont_strip_me.
+        try:
+            fail_str = system([["strip", "-u", "-x", "-S", exe]])
+        except CalledProcessError as cmd_error:
+            self.fail("Strip failed: %d"%(cmd_error.returncode))
+
+        popen = self.spawnSubprocess(exe)
+        self.addTearDownHook(self.cleanupSubprocesses)
+        if in_memory:
+          remove_file(exe)            
+
+        target = self.dbg.CreateTarget(None)
+        self.assertTrue(target.IsValid(), "Got a vaid empty target.")
+        error = lldb.SBError()
+        attach_info = lldb.SBAttachInfo()
+        attach_info.SetProcessID(popen.pid)
+        attach_info.SetIgnoreExisting(False)
+        process = target.Attach(attach_info, error)
+        self.assertTrue(error.Success(), "Didn't attach successfully to %d: %s"%(popen.pid, error.GetCString()))
+        
+        bkpt = target.BreakpointCreateByName("dont_strip_me", exe)
+        self.assertTrue(bkpt.GetNumLocations() > 0, "Didn't set the dont_strip_me bkpt.")
+        
+        threads = lldbutil.continue_to_breakpoint(process, bkpt)
+        self.assertEqual(len(threads), 1, "Didn't hit my breakpoint.")
+
+        # Our caller frame should have been stripped.  Make sure we made a synthetic symbol
+        # for it:
+        thread = threads[0]
+        self.assertTrue(thread.num_frames > 1, "Couldn't backtrace.")
+        name = thread.frame[1].GetFunctionName()
+        self.assertEqual("___lldb_unnamed_symbol1$$StripMe", name, "Frame name not synthetic")
+        
+
+        

Added: lldb/trunk/packages/Python/lldbsuite/test/macosx/function-starts/main.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/macosx/function-starts/main.cpp?rev=339833&view=auto
==============================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/macosx/function-starts/main.cpp (added)
+++ lldb/trunk/packages/Python/lldbsuite/test/macosx/function-starts/main.cpp Wed Aug 15 16:10:32 2018
@@ -0,0 +1,26 @@
+#include <stdio.h>
+#include <fcntl.h>
+
+#include <chrono>
+#include <thread>
+
+extern void dont_strip_me()
+{
+  printf("I wasn't stripped\n");
+}
+
+static void *a_function()
+{
+    while (1)
+    {
+        std::this_thread::sleep_for(std::chrono::microseconds(100)); 
+        dont_strip_me();
+    }
+    return 0;
+}
+
+int main(int argc, char const *argv[])
+{
+    a_function();
+    return 0;
+}

Modified: lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp?rev=339833&r1=339832&r2=339833&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp (original)
+++ lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp Wed Aug 15 16:10:32 2018
@@ -2351,7 +2351,8 @@ size_t ObjectFileMachO::ParseSymtab() {
                     indirect_syms_data_sp, 0,
                     indirect_syms_data_sp->GetByteSize());
             }
-          } else if (memory_module_load_level >=
+          }
+          if (memory_module_load_level >=
                      eMemoryModuleLoadLevelPartial) {
             if (function_starts_load_command.cmd) {
               const addr_t func_start_addr =




More information about the lldb-commits mailing list