diff --git a/examples/python/crashlog.py b/examples/python/crashlog.py
index 329b1c3..3e8fab5 100755
--- a/examples/python/crashlog.py
+++ b/examples/python/crashlog.py
@@ -420,7 +420,7 @@
                 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):
+def disassemble_instructions (instructions, pc, options, non_zeroeth_frame):
     lines = list()
     pc_index = -1
     comment_column = 50
@@ -440,11 +440,19 @@
                 lines[-1] += "; %s" % comment
 
     if pc_index >= 0:
-        if pc_index >= insts_before_pc:
-            start_idx = pc_index - insts_before_pc
-        else:
+        # If we are disassembling the non-zeroeth frame, we need to backup the PC by 1
+        if non_zeroeth_frame and pc_index > 0:
+            pc_index = pc_index - 1
+        if options.disassemble_before == -1:
             start_idx = 0
-        end_idx = pc_index + insts_after_pc
+        else:
+            start_idx = pc_index - options.disassemble_before
+        if start_idx < 0:
+            start_idx = 0
+        if options.disassemble_before == -1:
+            end_idx = inst_idx
+        else:
+            end_idx = pc_index + options.disassemble_after
         if end_idx > inst_idx:
             end_idx = inst_idx
         for i in range(start_idx, end_idx+1):
@@ -499,12 +507,16 @@
 be disassembled and lookups can be performed using the addresses found in the crash log.'''
     parser = optparse.OptionParser(description=description, prog='crashlog.py',usage=usage)
     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('-v', '--verbose', action='store_true', dest='verbose', help='display verbose debug info', 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('--load-all', action='store_true', dest='load_all_images', help='load all executable images, not just the images found in the crashed stack frames', default=False)
+    parser.add_option('-a', '--load-all', action='store_true', dest='load_all_images', help='load all executable images, not just the images found in the crashed stack frames', 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('--crashed-only', action='store_true', dest='crashed_only', help='only symbolicate the crashed thread', default=False)
+    parser.add_option('-g', '--debug-delay', type='int', dest='debug_delay', metavar='NSEC', help='pause for NSEC seconds for debugger', default=0)
+    parser.add_option('-c', '--crashed-only', action='store_true', dest='crashed_only', help='only symbolicate the crashed thread', default=False)
+    parser.add_option('-d', '--disasm-depth', type='int', dest='disassemble_depth', help='set the depth in stack frames that should be disassembled (default is 1)', default=1)
+    parser.add_option('-D', '--disasm-all', action='store_true', dest='disassemble_all_threads', help='enabled disassembly of frames on all threads (not just the crashed thread)', default=False)
+    parser.add_option('-B', '--disasm-before', type='int', dest='disassemble_before', help='the number of instructions to disassemble before the frame PC', default=4)
+    parser.add_option('-A', '--disasm-after', type='int', dest='disassemble_after', help='the number of instructions to disassemble after the frame PC', default=4)
     loaded_addresses = False
     try:
         (options, args) = parser.parse_args(command_args)
@@ -652,6 +664,7 @@
                         line_entry = frame.sym_ctx.GetLineEntry()
                         symbol = frame.sym_ctx.GetSymbol()
                         inlined_block = block.GetContainingInlinedBlock();
+                        disassemble = (this_thread_crashed or options.disassemble_all_threads) and frame_idx < options.disassemble_depth;
                         if inlined_block:
                             function_name = inlined_block.GetInlinedName();
                             block_range_idx = inlined_block.GetRangeIndexForBlockAddress (lldb.target.ResolveLoadAddress (frame.pc))
@@ -660,17 +673,17 @@
                                 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:
+                            if disassemble:
                                 instructions = function.GetInstructions(lldb.target)
                         elif function:
                             function_name = function.GetName()
                             function_start_load_addr = function.GetStartAddress().GetLoadAddress (lldb.target)
-                            if this_thread_crashed and frame_idx == 0:
+                            if disassemble:
                                 instructions = function.GetInstructions(lldb.target)
                         elif symbol:
                             function_name = symbol.GetName()
                             function_start_load_addr = symbol.GetStartAddress().GetLoadAddress (lldb.target)
-                            if this_thread_crashed and frame_idx == 0:
+                            if disassemble:
                                 instructions = symbol.GetInstructions(lldb.target)
 
                         if function_name:
@@ -708,7 +721,7 @@
                     prev_frame_index = frame.index
                     if instructions:
                         print
-                        disassemble_instructions (instructions, frame.pc, 4, 4)
+                        disassemble_instructions (instructions, frame.pc, options, frame.index > 0)
                         print
 
                 print                
