[Lldb-commits] [lldb] r148534 - /lldb/trunk/examples/python/crashlog.py

Greg Clayton gclayton at apple.com
Thu Jan 19 22:12:48 PST 2012


Author: gclayton
Date: Fri Jan 20 00:12:47 2012
New Revision: 148534

URL: http://llvm.org/viewvc/llvm-project?rev=148534&view=rev
Log:
More fixed to verify if a file in the crash log is installed in the current
system and also deal with dsymForUUID being available on the network, locally,
and not at all.


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

Modified: lldb/trunk/examples/python/crashlog.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/examples/python/crashlog.py?rev=148534&r1=148533&r2=148534&view=diff
==============================================================================
--- lldb/trunk/examples/python/crashlog.py (original)
+++ lldb/trunk/examples/python/crashlog.py Fri Jan 20 00:12:47 2012
@@ -17,6 +17,8 @@
 import re
 import sys
 import time
+import uuid
+
 
 PARSE_MODE_NORMAL = 0
 PARSE_MODE_THREAD = 1
@@ -81,59 +83,93 @@
     class Image:
         """Class that represents a binary images in a darwin crash log"""
         dsymForUUIDBinary = os.path.expanduser('~rc/bin/dsymForUUID')
+        if not os.path.exists(dsymForUUIDBinary):
+            dsymForUUIDBinary = commands.getoutput('which dsymForUUID')
+            
+        dwarfdump_uuid_regex = re.compile('UUID: ([-0-9a-fA-F]+) \(([^\(]+)\) .*')
         
         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
             self.ident = ident
             self.version = version
+            self.arch = None
             self.uuid = uuid
             self.path = path
+            self.resolved_path = None
+            self.dsym = None
             self.target = None
             self.module = None
-            self.plist = None
         
         def dump(self, prefix):
             print "%s%s" % (prefix, self)
         
         def __str__(self):
-            return "%#16.16x %s %s" % (self.text_addr_lo, self.uuid, self.path)
+            return "%#16.16x %s %s" % (self.text_addr_lo, self.uuid, self.get_resolved_path())
         
-        def basename(self):
-            if self.path:
-                return os.path.basename(self.path)
+        def get_resolved_path(self):
+            if self.resolved_path:
+                return self.resolved_path
+            elif self.path:
+                return self.path
+            return None
+
+        def get_resolved_path_basename(self):
+            path = self.get_resolved_path()
+            if path:
+                return os.path.basename(path)
+            return None
+
+        def dsym_basename(self):
+            if self.dsym:
+                return os.path.basename(self.dsym)
             return None
         
         def fetch_symboled_executable_and_dsym(self):
+            if self.resolved_path:
+                # Don't load a module twice...
+                return 0
+            print 'Locating %s %s...' % (self.uuid, self.path),
             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: %s failed...' % (dsym_for_uuid_command)
-                return 0
+                        plist = plist_root[self.uuid]
+                        if plist:
+                            if 'DBGArchitecture' in plist:
+                                self.arch = plist['DBGArchitecture']
+                            if 'DBGDSYMPath' in plist:
+                                self.dsym = os.path.realpath(plist['DBGDSYMPath'])
+                            if 'DBGSymbolRichExecutable' in plist:
+                                self.resolved_path = os.path.expanduser (plist['DBGSymbolRichExecutable'])
+            if not self.resolved_path and os.path.exists(self.path):
+                dwarfdump_cmd_output = commands.getoutput('dwarfdump --uuid "%s"' % self.path)
+                self_uuid = uuid.UUID(self.uuid)
+                for line in dwarfdump_cmd_output.splitlines():
+                    match = self.dwarfdump_uuid_regex.search (line)
+                    if match:
+                        dwarf_uuid_str = match.group(1)
+                        dwarf_uuid = uuid.UUID(dwarf_uuid_str)
+                        if self_uuid == dwarf_uuid:
+                            self.resolved_path = self.path
+                            self.arch = match.group(2)
+                            break;
+                if not self.resolved_path:
+                    print "error: file %s '%s' doesn't match the UUID in the installed file" % (self.uuid, self.path)
+                    return 0
+            if (self.resolved_path and os.path.exists(self.resolved_path)) or (self.path and os.path.exists(self.path)):
+                print 'ok'
+                if self.path != self.resolved_path:
+                    print '  exe = "%s"' % self.resolved_path 
+                if self.dsym:
+                    print ' dsym = "%s"' % self.dsym
+                return 1
             else:
-                return 1 # no dsym locating script, just use the paths in the crash log
+                return 0
         
         def load_module(self):
             if self.module:
@@ -146,18 +182,17 @@
                     else:
                         return 'error: %s' % error.GetCString()
                 else:
-                    return 'error: unable to find "__TEXT" section in "%s"' % self.path
+                    return 'error: unable to find "__TEXT" section in "%s"' % self.get_resolved_path()
             else:
                 return 'error: invalid module'
         
         def create_target(self, debugger):
             if self.fetch_symboled_executable_and_dsym ():
-                path_spec = lldb.SBFileSpec (self.path)
-                arch = self.plist['DBGArchitecture']
-                #print 'debugger.CreateTarget (path="%s", arch="%s")  uuid=%s' % (self.path, arch, self.uuid)
+                resolved_path = self.get_resolved_path();
+                path_spec = lldb.SBFileSpec (resolved_path)
                 #result.PutCString ('plist[%s] = %s' % (uuid, self.plist))
                 error = lldb.SBError()
-                self.target = debugger.CreateTarget (self.path, arch, None, False, error);
+                self.target = debugger.CreateTarget (resolved_path, self.arch, None, False, error);
                 if self.target:
                     self.module = self.target.FindModule (path_spec)
                     if self.module:
@@ -167,19 +202,18 @@
                         else:
                             return None
                     else:
-                        return 'error: unable to get module for (%s) "%s"' % (arch, self.path)
+                        return 'error: unable to get module for (%s) "%s"' % (self.arch, resolved_path)
                 else:
-                    return 'error: unable to create target for (%s) "%s"' % (arch, self.path)
+                    return 'error: unable to create target for (%s) "%s"' % (self.arch, resolved_path)
         
         def add_target_module(self, target):
             if target:
                 self.target = target
                 if self.fetch_symboled_executable_and_dsym ():
-                    path_spec = lldb.SBFileSpec (self.path)
-                    arch = self.plist['DBGArchitecture']
-                    #result.PutCString ('plist[%s] = %s' % (uuid, self.plist))
-                    #print 'target.AddModule (path="%s", arch="%s", uuid=%s)' % (self.path, arch, self.uuid)
-                    self.module = target.AddModule (self.path, arch, self.uuid)
+                    resolved_path = self.get_resolved_path();
+                    path_spec = lldb.SBFileSpec (resolved_path)
+                    #print 'target.AddModule (path="%s", arch="%s", uuid=%s)' % (resolved_path, self.arch, self.uuid)
+                    self.module = target.AddModule (resolved_path, self.arch, self.uuid)
                     if self.module:
                         err = self.load_module()
                         if err:
@@ -187,7 +221,7 @@
                         else:
                             return None
                     else:
-                        return 'error: unable to get module for (%s) "%s"' % (arch, self.path)
+                        return 'error: unable to get module for (%s) "%s"' % (self.arch, resolved_path)
             else:
                 return 'error: invalid target'
         





More information about the lldb-commits mailing list