import lldb

def disassemble(debugger, command, result, dict):
    if lldb.frame.function:
        instructions = lldb.frame.function.instructions
        start_addr = lldb.frame.function.addr.load_addr
        name = lldb.frame.function.name
    elif lldb.frame.symbol:
        instructions = lldb.frame.symbol.instructions
        start_addr = lldb.frame.symbol.addr.load_addr
        name = lldb.frame.symbol.name
    
    for inst in instructions:
        inst_addr = inst.addr.load_addr
        inst_offset = inst_addr - start_addr
        comment = inst.comment
        if comment:
            print "<%s + %-4u> 0x%x %8s  %s ; %s" % (name, inst_offset, inst_addr, inst.mnemonic, inst.operands, comment)
        else:
            print "<%s + %-4u> 0x%x %8s  %s" % (name, inst_offset, inst_addr, inst.mnemonic, inst.operands)
            
# Install the command when the module gets imported
lldb.debugger.HandleCommand('command script add -f gdb_disassemble.disassemble gdb-disassemble')
print 'Installed "gdb-disassemble" command for disassembly'