#!/usr/bin/python

#----------------------------------------------------------------------
# Be sure to add the python path that points to the LLDB shared library.
# On MacOSX csh, tcsh:
#   setenv PYTHONPATH /Developer/Library/PrivateFrameworks/LLDB.framework/Resources/Python
# On MacOSX sh, bash:
#   export PYTHONPATH=/Developer/Library/PrivateFrameworks/LLDB.framework/Resources/Python
#----------------------------------------------------------------------

import lldb
import os
import sys
import signal

def disassemble_instructions (insts):
    for i in insts:
        print i

# Create a new debugger instance
debugger = lldb.SBDebugger.Create()

# When we step or continue, don't return from the function until the process 
# stops. We do this by setting the async mode to false.
debugger.SetAsync (False)

# Create a target from a file and arch
print "Creating a target for '%s'" % sys.argv[1]

target = debugger.CreateTargetWithFileAndArch (sys.argv[1], lldb.LLDB_ARCH_DEFAULT)

if target:
    # If the target is valid set a breakpoint at main
    main_bp = target.BreakpointCreateByName ("main", target.GetExecutable().GetFilename());

    print main_bp

    # Launch the process. Since we specified synchronous mode, we won't return
    # from this function until we hit the breakpoint at main
    process = target.LaunchSimple (None, None, os.getcwd())
    
    # Make sure the launch went ok
    if process:
        # Print some simple process info
        state = process.GetState ()
        print process
        if state == lldb.eStateStopped:
            # Get the first thread
            thread = process.GetThreadAtIndex (0)
            if thread:
                # Print some simple thread info
                print thread
                # Get the first frame
                frame = thread.GetFrameAtIndex (0)
                if frame:
                    # Print some simple frame info
                    print frame
                    function = frame.GetFunction()
                    # See if we have debug info (a function)
                    if function:
                        # We do have a function, print some info for the function
                        print function
                        # Now get all instructions for this function and print them
                        insts = function.GetInstructions(target)
                        disassemble_instructions (insts)
                    else:
                        # See if we have a symbol in the symbol table for where we stopped
                        symbol = frame.GetSymbol();
                        if symbol:
                            # We do have a symbol, print some info for the symbol
                            print symbol
                            # Now get all instructions for this symbol and print them
                            insts = symbol.GetInstructions(target)
                            disassemble_instructions (insts)

                    registerList = frame.GetRegisters()
                    print "Frame registers (size of register set = %d):" % registerList.GetSize()
                    for value in registerList:
                        #print value
                        print "%s (number of children = %d):" % (value.GetName(), value.GetNumChildren())
                        for child in value:
                            print "Name: ", child.GetName(), " Value: ", child.GetValue(frame)

            print "Hit the breakpoint at main, enter to continue and wait for program to exit or 'Ctrl-D'/'quit' to terminate the program"
            next = sys.stdin.readline()
            if not next or next.rstrip('\n') == 'quit':
                print "Terminating the inferior process..."
                process.Kill()
            else:
                # Now continue to the program exit
                process.Continue()
                # When we return from the above function we will hopefully be at the
                # program exit. Print out some process info
                print process
        elif state == lldb.eStateExited:
            print "Didn't hit the breakpoint at main, program has exited..."
        else:
            print "Unexpected process state: %s, killing process..." % debugger.StateAsCString (state)
            process.Kill()

        

lldb.SBDebugger.Terminate()

@@ -580,16 +580,400 @@
 rint i%0A%0A
+def usage():%0A    print %22Usage: disasm.py %5B-n name%5D executable-image%22%0A    print %22       By default, it breaks at and disassembles the 'main' function.%22%0A    sys.exit(0)%0A%0Aif len(sys.argv) == 2:%0A    fname = 'main'%0A    exe = sys.argv%5B1%5D%0Aelif len(sys.argv) == 4:%0A    if sys.argv%5B1%5D != '-n':%0A        usage()%0A    else:%0A        fname = sys.argv%5B2%5D%0A        exe = sys.argv%5B3%5D%0Aelse:%0A    usage()%0A%0A
 # Create
@@ -1271,27 +1271,19 @@
 '%25s'%22 %25 
-sys.argv%5B1%5D
+exe
 %0A%0Atarget
@@ -1323,27 +1323,19 @@
 ndArch (
-sys.argv%5B1%5D
+exe
 , lldb.L
@@ -1467,14 +1467,13 @@
 me (
-%22main%22
+fname
 , ta

Add a little spice to the script to allow us to specify a function name to break at and to disassemble.