From 73cc2c6a7ab853b79e12d215060936fec7bf036d Mon Sep 17 00:00:00 2001
From: Don Kjer <don@lindenlab.com>
Date: Sat, 20 Oct 2012 09:46:59 +0000
Subject: [PATCH] Adding expanded searching for symbols during google breakpad
 symbol scan

---
 indra/newview/CMakeLists.txt               | 18 ++++++--
 indra/newview/generate_breakpad_symbols.py | 54 ++++++++++++++++------
 2 files changed, 52 insertions(+), 20 deletions(-)

diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index c0a252637f0..6bdcf2df259 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -1987,8 +1987,9 @@ if (INSTALL)
 endif (INSTALL)
 
 if (PACKAGE)
+  set(SYMBOL_SEARCH_DIRS "")
   if (WINDOWS)
-    set(VIEWER_DIST_DIR "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}")
+    list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}")
     set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-windows.tar.bz2")
     # slplugin.exe failing symbols dump - need to debug, might have to do with updated version of google breakpad
     # set(VIEWER_EXE_GLOBS "${VIEWER_BINARY_NAME}${CMAKE_EXECUTABLE_SUFFIX} slplugin.exe")
@@ -1997,13 +1998,20 @@ if (PACKAGE)
     set(VIEWER_COPY_MANIFEST copy_w_viewer_manifest)
   endif (WINDOWS)
   if (DARWIN)
-    set(VIEWER_DIST_DIR "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app")
+    list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}")
+    # *TODO: Generate these search dirs in the cmake files related to each binary.
+    list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/llplugin/slplugin/${CMAKE_CFG_INTDIR}")
+    list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/mac_crash_logger/${CMAKE_CFG_INTDIR}")
+    list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/mac_updater/${CMAKE_CFG_INTDIR}")
+    list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/media_plugins/gstreamer010/${CMAKE_CFG_INTDIR}")
+    list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/media_plugins/quicktime/${CMAKE_CFG_INTDIR}")
+    list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/media_plugins/webkit/${CMAKE_CFG_INTDIR}")
     set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-darwin.tar.bz2")
-    set(VIEWER_EXE_GLOBS "'Second Life' SLPlugin")
+    set(VIEWER_EXE_GLOBS "'Second Life' SLPlugin mac-updater mac-crash-logger")
     set(VIEWER_LIB_GLOB "*.dylib")
   endif (DARWIN)
   if (LINUX)
-    set(VIEWER_DIST_DIR "${CMAKE_CURRENT_BINARY_DIR}/packaged")
+    list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_CURRENT_BINARY_DIR}/packaged")
     set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-linux.tar.bz2")
     set(VIEWER_EXE_GLOBS "do-not-directly-run-secondlife-bin SLPlugin")
     set(VIEWER_LIB_GLOB "*${CMAKE_SHARED_MODULE_SUFFIX}*")
@@ -2023,7 +2031,7 @@ if (PACKAGE)
     ARGS
       "${CMAKE_CURRENT_SOURCE_DIR}/generate_breakpad_symbols.py"
       "${LLBUILD_CONFIG}"
-      "${VIEWER_DIST_DIR}"
+      "${SYMBOL_SEARCH_DIRS}"
       "${VIEWER_EXE_GLOBS}"
       "${VIEWER_LIB_GLOB}"
       "${AUTOBUILD_INSTALL_DIR}/bin/dump_syms"
diff --git a/indra/newview/generate_breakpad_symbols.py b/indra/newview/generate_breakpad_symbols.py
index ddc8a41136c..4181e4ebb30 100644
--- a/indra/newview/generate_breakpad_symbols.py
+++ b/indra/newview/generate_breakpad_symbols.py
@@ -39,17 +39,20 @@
 import subprocess
 import tarfile
 import StringIO
+import pprint
+
+DEBUG=False
 
 def usage():
-    print >>sys.stderr, "usage: %s viewer_dir viewer_exes libs_suffix dump_syms_tool viewer_symbol_file" % sys.argv[0]
+    print >>sys.stderr, "usage: %s search_dirs viewer_exes libs_suffix dump_syms_tool viewer_symbol_file" % sys.argv[0]
 
 class MissingModuleError(Exception):
     def __init__(self, modules):
         Exception.__init__(self, "Failed to find required modules: %r" % modules)
         self.modules = modules
 
-def main(configuration, viewer_dir, viewer_exes, libs_suffix, dump_syms_tool, viewer_symbol_file):
-    print "generate_breakpad_symbols run with args: %s" % str((configuration, viewer_dir, viewer_exes, libs_suffix, dump_syms_tool, viewer_symbol_file))
+def main(configuration, search_dirs, viewer_exes, libs_suffix, dump_syms_tool, viewer_symbol_file):
+    print "generate_breakpad_symbols run with args: %s" % str((configuration, search_dirs, viewer_exes, libs_suffix, dump_syms_tool, viewer_symbol_file))
 
     if not re.match("release", configuration, re.IGNORECASE):
         print "skipping breakpad symbol generation for non-release build."
@@ -67,28 +70,49 @@ def matches(f):
             return True
         return fnmatch.fnmatch(f, libs_suffix)
 
+    search_dirs = search_dirs.split(";")
+
     def list_files():
-        for (dirname, subdirs, filenames) in os.walk(viewer_dir):
-            #print "scanning '%s' for modules..." % dirname
-            for f in itertools.ifilter(matches, filenames):
-                yield os.path.join(dirname, f)
+        for search_dir in search_dirs:
+            for (dirname, subdirs, filenames) in os.walk(search_dir):
+                if DEBUG:
+                    print "scanning '%s' for modules..." % dirname
+                for f in itertools.ifilter(matches, filenames):
+                    yield os.path.join(dirname, f)
 
     def dump_module(m):
         print "dumping module '%s' with '%s'..." % (m, dump_syms_tool)
         dsym_full_path = m
-        if sys.platform in ['darwin']:
-            dsym_dir=os.path.join(m+".dSYM", 'Contents', 'Resources', 'DWARF')
-            if os.path.isdir(dsym_dir):
-                dsym_full_path=os.path.join(dsym_dir, os.path.basename(m))
-            else:
-                dsym_full_path = m
         child = subprocess.Popen([dump_syms_tool, dsym_full_path] , stdout=subprocess.PIPE)
         out, err = child.communicate()
         return (m,child.returncode, out, err)
 
-    out = tarfile.open(viewer_symbol_file, 'w:bz2')
+    
+    modules = {}
+        
+    for m in list_files():
+        if DEBUG:
+            print "examining module '%s' ... " % m,
+        filename=os.path.basename(m)
+        if -1 != m.find("DWARF"):
+            # Just use this module; it has the symbols we want.
+            modules[filename] = m
+            if DEBUG:
+                print "found dSYM entry"
+        elif filename not in modules:
+            # Only use this if we don't already have a (possibly better) entry.
+            modules[filename] = m
+            if DEBUG:
+                print "found new entry"
+        elif DEBUG:
+            print "ignoring entry"
+
+
+    print "Found these following modules:"
+    pprint.pprint( modules )
 
-    for (filename,status,symbols,err) in itertools.imap(dump_module, list_files()):
+    out = tarfile.open(viewer_symbol_file, 'w:bz2')
+    for (filename,status,symbols,err) in itertools.imap(dump_module, modules.values()):
         if status == 0:
             module_line = symbols[:symbols.index('\n')]
             module_line = module_line.split()
-- 
GitLab