[Lldb-commits] [lldb] r148529 - in /lldb/trunk/examples/python: crashlog.lldb crashlog.py

Greg Clayton gclayton at apple.com
Thu Jan 19 21:32:35 CST 2012


Author: gclayton
Date: Thu Jan 19 21:32:35 2012
New Revision: 148529

URL: http://llvm.org/viewvc/llvm-project?rev=148529&view=rev
Log:
Improved the regular expressions to handle "+" characters being at the front
of the identifier name in the binary images section. Improved the regular
expression for the frames.

Added a new file "crashlog.lldb" which can be sourced with "command source"
that will import the module and set itself up to be used as a command.


Added:
    lldb/trunk/examples/python/crashlog.lldb
Modified:
    lldb/trunk/examples/python/crashlog.py

Added: lldb/trunk/examples/python/crashlog.lldb
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/examples/python/crashlog.lldb?rev=148529&view=auto
==============================================================================
--- lldb/trunk/examples/python/crashlog.lldb (added)
+++ lldb/trunk/examples/python/crashlog.lldb Thu Jan 19 21:32:35 2012
@@ -0,0 +1,5 @@
+# source this file while being chdir'ed in the directory that contains
+# this file at the LLDB command line with:
+# (lldb) command source crashlog.lldb
+script import crashlog
+command script add -f crashlog.Symbolicate crashlog

Modified: lldb/trunk/examples/python/crashlog.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/examples/python/crashlog.py?rev=148529&r1=148528&r2=148529&view=diff
==============================================================================
--- lldb/trunk/examples/python/crashlog.py (original)
+++ lldb/trunk/examples/python/crashlog.py Thu Jan 19 21:32:35 2012
@@ -28,9 +28,9 @@
     """Class that does parses darwin crash logs"""
     thread_state_regex = re.compile('^Thread ([0-9]+) crashed with')
     thread_regex = re.compile('^Thread ([0-9]+)([^:]*):(.*)')
-    frame_regex = re.compile('^([0-9]+) +([^ ]+) +\t(0x[0-9a-fA-F]+) +(.*)')
-    image_regex_uuid = re.compile('(0x[0-9a-fA-F]+)[- ]+(0x[0-9a-fA-F]+) +([^ ]+) +([^<]+)<([-0-9a-fA-F]+)> (.*)');
-    image_regex_no_uuid = re.compile('(0x[0-9a-fA-F]+)[- ]+(0x[0-9a-fA-F]+) +([^ ]+) +([^/]+)/(.*)');
+    frame_regex = re.compile('^([0-9]+) +([^ ]+) *\t(0x[0-9a-fA-F]+) +(.*)')
+    image_regex_uuid = re.compile('(0x[0-9a-fA-F]+)[- ]+(0x[0-9a-fA-F]+) +[+]?([^ ]+) +([^<]+)<([-0-9a-fA-F]+)> (.*)');
+    image_regex_no_uuid = re.compile('(0x[0-9a-fA-F]+)[- ]+(0x[0-9a-fA-F]+) +[+]?([^ ]+) +([^/]+)/(.*)');
     empty_line_regex = re.compile('^$')
         
     class Thread:
@@ -80,6 +80,8 @@
     
     class Image:
         """Class that represents a binary images in a darwin crash log"""
+        dsymForUUIDBinary = os.path.expanduser('~rc/bin/dsymForUUID')
+        
         def __init__(self, text_addr_lo, text_addr_hi, ident, version, uuid, path):
             self.text_addr_lo = text_addr_lo
             self.text_addr_hi = text_addr_hi
@@ -103,32 +105,35 @@
             return None
         
         def fetch_symboled_executable_and_dsym(self):
-            dsym_for_uuid_command = ('~rc/bin/dsymForUUID %s' % self.uuid)
-            print 'Fetching %s %s...' % (self.uuid, self.path),
-            s = commands.getoutput(dsym_for_uuid_command)
-            if s:
-                plist_root = plistlib.readPlistFromString (s)
-                if plist_root:
-                    # pp = pprint.PrettyPrinter(indent=4)
-                    # pp.pprint(plist_root)
-                    self.plist = plist_root[self.uuid]
-                    if self.plist:
-                        if 'DBGError' in self.plist:
-                            err = self.plist['DBGError']
-                            if isinstance(err, unicode):
-                                err = err.encode('utf-8')
-                            print 'error: %s' % err
-                        elif 'DBGSymbolRichExecutable' in self.plist:
-                            self.path = os.path.expanduser (self.plist['DBGSymbolRichExecutable'])
-                            #print 'success: symboled exe is "%s"' % self.path
-                            print 'ok'
-                            return 1
-                    print 'error: failed to get plist dictionary entry for UUID %s: %s' % (uuid, plist_root)
+            if os.path.exists(self.dsymForUUIDBinary):
+                dsym_for_uuid_command = '%s %s' % (self.dsymForUUIDBinary, self.uuid)
+                print 'Fetching %s %s...' % (self.uuid, self.path),
+                s = commands.getoutput(dsym_for_uuid_command)
+                if s:
+                    plist_root = plistlib.readPlistFromString (s)
+                    if plist_root:
+                        # pp = pprint.PrettyPrinter(indent=4)
+                        # pp.pprint(plist_root)
+                        self.plist = plist_root[self.uuid]
+                        if self.plist:
+                            if 'DBGError' in self.plist:
+                                err = self.plist['DBGError']
+                                if isinstance(err, unicode):
+                                    err = err.encode('utf-8')
+                                print 'error: %s' % err
+                            elif 'DBGSymbolRichExecutable' in self.plist:
+                                self.path = os.path.expanduser (self.plist['DBGSymbolRichExecutable'])
+                                #print 'success: symboled exe is "%s"' % self.path
+                                print 'ok'
+                                return 1
+                        print 'error: failed to get plist dictionary entry for UUID %s: %s' % (uuid, plist_root)
+                    else:
+                        print 'error: failed to extract plist from "%s"' % (s)
                 else:
-                    print 'error: failed to extract plist from "%s"' % (s)
+                    print 'error: %s failed...' % (dsym_for_uuid_command)
+                return 0
             else:
-                print 'error: %s failed...' % (dsym_for_uuid_command)
-            return 0
+                return 1 # no dsym locating script, just use the paths in the crash log
         
         def load_module(self):
             if self.module:
@@ -136,7 +141,7 @@
                 if text_section:
                     error = self.target.SetSectionLoadAddress (text_section, self.text_addr_lo)
                     if error.Success():
-                        print 'Success: loaded %s.__TEXT = 0x%x' % (self.basename(), self.text_addr_lo)
+                        #print 'Success: loaded %s.__TEXT = 0x%x' % (self.basename(), self.text_addr_lo)
                         return None
                     else:
                         return 'error: %s' % error.GetCString()
@@ -286,7 +291,7 @@
                         self.idents.append(ident)
                     thread.frames.append (CrashLog.Frame(int(frame_match.group(1)), int(frame_match.group(3), 0), frame_match.group(4)))
                 else:
-                    print "error: frame regex failed"
+                    print 'error: frame regex failed for line: "%s"' % line
             elif parse_mode == PARSE_MODE_IMAGES:
                 image_match = self.image_regex_uuid.search (line)
                 if image_match:
@@ -436,7 +441,8 @@
         options.dependents = False
         for crash_log_file in options.crash_log_files:
             crash_log = CrashLog(crash_log_file)
-            crash_log.dump()
+            if options.verbose:
+                crash_log.dump()
             if crash_log.images:
                 err = crash_log.images[0].create_target (debugger)
                 if err:




More information about the lldb-commits mailing list