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

Greg Clayton gclayton at apple.com
Fri Jan 20 11:25:32 PST 2012


Author: gclayton
Date: Fri Jan 20 13:25:32 2012
New Revision: 148561

URL: http://llvm.org/viewvc/llvm-project?rev=148561&view=rev
Log:
Make the script work again from the command line as long as the PYTHONPATH 
environment variable it set to include a path to lldb.py.

Also fixed the case where the executable can't be located and doesn't match
what is installed on the current system. It will still symbolicate the other
frames, and will just show what was originally in the crash log file.

Also removed the --crash-log option so the arguments to the "crashlog"
command are one or more paths to crash logs.

Fixed the script to "auto-install" itself when loaded from the embedded
script interpreter. Now you only need to import the module and the
command is ready for use.


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=148561&r1=148560&r2=148561&view=diff
==============================================================================
--- lldb/trunk/examples/python/crashlog.py (original)
+++ lldb/trunk/examples/python/crashlog.py Fri Jan 20 13:25:32 2012
@@ -98,7 +98,6 @@
             self.path = path
             self.resolved_path = None
             self.dsym = None
-            self.target = None
             self.module = None
         
         def dump(self, prefix):
@@ -172,10 +171,12 @@
                 return 0
         
         def load_module(self):
+            if not lldb.target:
+                return 'error: no target'
             if self.module:
                 text_section = self.module.FindSection ("__TEXT")
                 if text_section:
-                    error = self.target.SetSectionLoadAddress (text_section, self.text_addr_lo)
+                    error = lldb.target.SetSectionLoadAddress (text_section, self.text_addr_lo)
                     if error.Success():
                         #print 'Success: loaded %s.__TEXT = 0x%x' % (self.basename(), self.text_addr_lo)
                         return None
@@ -186,15 +187,15 @@
             else:
                 return 'error: invalid module'
         
-        def create_target(self, debugger):
+        def create_target(self):
             if self.fetch_symboled_executable_and_dsym ():
                 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 (resolved_path, self.arch, None, False, error);
-                if self.target:
-                    self.module = self.target.FindModule (path_spec)
+                lldb.target = lldb.debugger.CreateTarget (resolved_path, self.arch, None, False, error);
+                if lldb.target:
+                    self.module = lldb.target.FindModule (path_spec)
                     if self.module:
                         err = self.load_module()
                         if err:
@@ -205,15 +206,16 @@
                         return 'error: unable to get module for (%s) "%s"' % (self.arch, resolved_path)
                 else:
                     return 'error: unable to create target for (%s) "%s"' % (self.arch, resolved_path)
+            else:
+                return 'error: unable to locate main executable (%s) "%s"' % (self.arch, self.path)
         
-        def add_target_module(self, target):
-            if target:
-                self.target = target
+        def add_target_module(self):
+            if lldb.target:
                 if self.fetch_symboled_executable_and_dsym ():
                     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)
+                    self.module = lldb.target.AddModule (resolved_path, self.arch, self.uuid)
                     if self.module:
                         err = self.load_module()
                         if err:
@@ -374,18 +376,39 @@
                 return image
         return None
     
-def disassemble_instructions (target, instructions, pc, insts_before_pc, insts_after_pc):
+    def create_target(self):
+        if not self.images:
+            return 'error: no images in crash log'
+        exe_path = self.images[0].get_resolved_path()
+        err = self.images[0].create_target ()
+        if not err:
+            return None # success
+        # We weren't able to open the main executable as, but we can still symbolicate
+        if self.idents:
+            for ident in idents:
+                image = self.find_image_with_identifier (ident)
+                if image:
+                    err = image.create_target ()
+                    if not err:
+                        return None # success
+        for image in self.images:
+            err = image.create_target ()
+            if not err:
+                return None # success
+        return 'error: unable to locate any executables from the crash log'
+
+def disassemble_instructions (instructions, pc, insts_before_pc, insts_after_pc):
     lines = list()
     pc_index = -1
     comment_column = 50
     for inst_idx, inst in enumerate(instructions):
-        inst_pc = inst.GetAddress().GetLoadAddress(target);
+        inst_pc = inst.GetAddress().GetLoadAddress(lldb.target);
         if pc == inst_pc:
             pc_index = inst_idx
-        mnemonic = inst.GetMnemonic (target)
-        operands =  inst.GetOperands (target)
-        comment =  inst.GetComment (target)
-        #data = inst.GetData (target)
+        mnemonic = inst.GetMnemonic (lldb.target)
+        operands =  inst.GetOperands (lldb.target)
+        comment =  inst.GetComment (lldb.target)
+        #data = inst.GetData (lldb.target)
         lines.append ("%#16.16x: %8s %s" % (inst_pc, mnemonic, operands))
         if comment:
             line_len = len(lines[-1])
@@ -439,51 +462,33 @@
     SymbolicateCrashLog (command.split())
         
 def SymbolicateCrashLog(command_args):
-    
-    parser = optparse.OptionParser(description='A script that parses skinny and universal mach-o files.')
-    parser.add_option('--arch', type='string', metavar='arch', dest='triple', help='specify one architecture or target triple')
+    print 'command_args = %s' % command_args
+    parser = optparse.OptionParser(description='Parses darwin crash log files and symbolicates them.')
     parser.add_option('--platform', type='string', metavar='platform', dest='platform', help='specify one platform by name')
     parser.add_option('--verbose', action='store_true', dest='verbose', help='display verbose debug info', default=False)
-    parser.add_option('--interactive', action='store_true', dest='interactive', help='enable interactive mode', default=False)
     parser.add_option('--no-images', action='store_false', dest='show_images', help='don\'t show images in stack frames', default=True)
-    parser.add_option('--no-dependents', action='store_false', dest='dependents', help='skip loading dependent modules', default=True)
-    parser.add_option('--sections', action='store_true', dest='dump_sections', help='show module sections', default=False)
-    parser.add_option('--symbols', action='store_true', dest='dump_symbols', help='show module symbols', default=False)
     parser.add_option('--image-list', action='store_true', dest='dump_image_list', help='show image list', default=False)
     parser.add_option('--debug-delay', type='int', dest='debug_delay', metavar='NSEC', help='pause for NSEC seconds for debugger', default=0)
-    parser.add_option('--section-depth', type='int', dest='section_depth', help='set the section depth to use when showing sections', default=0)
-    parser.add_option('--section-data', type='string', action='append', dest='sect_data_names', help='specify sections by name to display data for')
-    parser.add_option('--address', type='int', action='append', dest='addresses', help='specify addresses to lookup')
-    parser.add_option('--crash-log', type='string', action='append', dest='crash_log_files', help='specify crash log files to symbolicate')
-    parser.add_option('--crashed-only', action='store_true', dest='crashed_only', help='only show the crashed thread', default=False)
+    parser.add_option('--crashed-only', action='store_true', dest='crashed_only', help='only symbolicate the crashed thread', default=False)
     loaded_addresses = False
     (options, args) = parser.parse_args(command_args)
     if options.verbose:
         print 'options', options
-
     if options.debug_delay > 0:
         print "Waiting %u seconds for debugger to attach..." % options.debug_delay
         time.sleep(options.debug_delay)
-
-    # Create a new debugger instance
-    debugger = lldb.SBDebugger.Create()
-
     error = lldb.SBError()
-    
-    
-    if options.crash_log_files:
-        options.dependents = False
-        for crash_log_file in options.crash_log_files:
+    if args:
+        for crash_log_file in args:
             crash_log = CrashLog(crash_log_file)
             if options.verbose:
                 crash_log.dump()
             if crash_log.images:
-                err = crash_log.images[0].create_target (debugger)
+                err = crash_log.create_target ()
                 if err:
                     print err
                 else:
-                    target = crash_log.images[0].target
-                    exe_module = target.GetModuleAtIndex(0)
+                    exe_module = lldb.target.GetModuleAtIndex(0)
                     image_paths = list()
                     # for i in range (1, len(crash_log.images)):
                     #     image = crash_log.images[i]
@@ -493,7 +498,7 @@
                             if image.path in image_paths:
                                 print "warning: skipping %s loaded at %#16.16x duplicate entry (probably commpage)" % (image.path, image.text_addr_lo)
                             else:
-                                err = image.add_target_module (target)
+                                err = image.add_target_module ()
                                 if err:
                                     print err
                                 else:
@@ -514,7 +519,7 @@
                         # any parent frames of inlined functions
                         for frame_idx, frame in enumerate(thread.frames):
                             # Resolve the frame's pc into a section + offset address 'pc_addr'
-                            pc_addr = target.ResolveLoadAddress (frame.pc)
+                            pc_addr = lldb.target.ResolveLoadAddress (frame.pc)
                             # Check to see if we were able to resolve the address
                             if pc_addr:
                                 # We were able to resolve the frame's PC into a section offset
@@ -525,7 +530,7 @@
                                 # line table entry and/or symbol. If the frame has a block, then
                                 # we can look for inlined frames, which are represented by blocks
                                 # that have inlined information in them
-                                frame.sym_ctx = target.ResolveSymbolContextForAddress (pc_addr, lldb.eSymbolContextEverything);
+                                frame.sym_ctx = lldb.target.ResolveSymbolContextForAddress (pc_addr, lldb.eSymbolContextEverything);
 
                                 # dump if the verbose option was specified
                                 if options.verbose:
@@ -552,7 +557,7 @@
                                 while new_frame.sym_ctx:
                                     # We have a parent frame of an inlined frame, create a new frame
                                     # Convert the section + offset 'parent_pc_addr' to a load address 
-                                    new_frame.pc = parent_pc_addr.GetLoadAddress(target)
+                                    new_frame.pc = parent_pc_addr.GetLoadAddress(lldb.target)
                                     # push the new frame onto the new frame stack
                                     new_thread_frames.append (new_frame)
                                     # dump if the verbose option was specified
@@ -592,24 +597,24 @@
                                 inlined_block = block.GetContainingInlinedBlock();
                                 if inlined_block:
                                     function_name = inlined_block.GetInlinedName();
-                                    block_range_idx = inlined_block.GetRangeIndexForBlockAddress (target.ResolveLoadAddress (frame.pc))
+                                    block_range_idx = inlined_block.GetRangeIndexForBlockAddress (lldb.target.ResolveLoadAddress (frame.pc))
                                     if block_range_idx < lldb.UINT32_MAX:
                                         block_range_start_addr = inlined_block.GetRangeStartAddress (block_range_idx)
-                                        function_start_load_addr = block_range_start_addr.GetLoadAddress (target)
+                                        function_start_load_addr = block_range_start_addr.GetLoadAddress (lldb.target)
                                     else:
                                         function_start_load_addr = frame.pc
                                     if this_thread_crashed and frame_idx == 0:
-                                        instructions = function.GetInstructions(target)
+                                        instructions = function.GetInstructions(lldb.target)
                                 elif function:
                                     function_name = function.GetName()
-                                    function_start_load_addr = function.GetStartAddress().GetLoadAddress (target)
+                                    function_start_load_addr = function.GetStartAddress().GetLoadAddress (lldb.target)
                                     if this_thread_crashed and frame_idx == 0:
-                                        instructions = function.GetInstructions(target)
+                                        instructions = function.GetInstructions(lldb.target)
                                 elif symbol:
                                     function_name = symbol.GetName()
-                                    function_start_load_addr = symbol.GetStartAddress().GetLoadAddress (target)
+                                    function_start_load_addr = symbol.GetStartAddress().GetLoadAddress (lldb.target)
                                     if this_thread_crashed and frame_idx == 0:
-                                        instructions = symbol.GetInstructions(target)
+                                        instructions = symbol.GetInstructions(lldb.target)
 
                                 if function_name:
                                     # Print the function or symbol name and annotate if it was inlined
@@ -646,7 +651,7 @@
                             prev_frame_index = frame.index
                             if instructions:
                                 print
-                                disassemble_instructions (target, instructions, frame.pc, 4, 4)
+                                disassemble_instructions (instructions, frame.pc, 4, 4)
                                 print
 
                         print                
@@ -658,5 +663,10 @@
         
 
 if __name__ == '__main__':
-    SymbolicateCrashLog (args)
+    # Create a new debugger instance
+    lldb.debugger = lldb.SBDebugger.Create()
+    SymbolicateCrashLog (sys.argv)
+elif lldb.debugger:
+    lldb.debugger.HandleCommand('command script add -f crashlog.Symbolicate crashlog')
+    print '"crashlog" command installed, type "crashlog --help" for detailed help'
 





More information about the lldb-commits mailing list