1#!/usr/bin/python 2 3#---------------------------------------------------------------------- 4# Be sure to add the python path that points to the LLDB shared library. 5# On MacOSX csh, tcsh: 6# setenv PYTHONPATH /Developer/Library/PrivateFrameworks/LLDB.framework/Resources/Python 7# On MacOSX sh, bash: 8# export PYTHONPATH=/Developer/Library/PrivateFrameworks/LLDB.framework/Resources/Python 9#---------------------------------------------------------------------- 10 11import lldb 12import os 13import sys 14import time 15 16def disassemble_instructions (insts): 17 for i in range(insts.GetSize()): 18 print insts.GetInstructionAtIndex(i) 19 20# Create a new debugger instance 21debugger = lldb.SBDebugger.Create() 22 23# When we step or continue, don't return from the function until the process 24# stops. We do this by setting the async mode to false. 25debugger.SetAsync (False) 26 27# Create a target from a file and arch 28print "Creating a target for '%s'" % sys.argv[1] 29 30target = debugger.CreateTargetWithFileAndArch (sys.argv[1], lldb.LLDB_ARCH_DEFAULT) 31 32if target.IsValid(): 33 # If the target is valid set a breakpoint at main 34 main_bp = target.BreakpointCreateByName ("main", target.GetExecutable().GetFilename()); 35 36 print main_bp 37 38 # Launch the process. Since we specified synchronous mode, we won't return 39 # from this function until we hit the breakpoint at main 40 error = lldb.SBError() 41 process = target.Launch (debugger.GetListener(), None, None, os.ctermid(), os.ctermid(), os.ctermid(), None, 0, False, error) 42 43 # Make sure the launch went ok 44 if process.IsValid(): 45 # Print some simple process info 46 state = process.GetState () 47 print process 48 if state == lldb.eStateStopped: 49 # Get the first thread 50 thread = process.GetThreadAtIndex (0) 51 if thread.IsValid(): 52 # Print some simple thread info 53 print thread 54 # Get the first frame 55 frame = thread.GetFrameAtIndex (0) 56 if frame.IsValid(): 57 # Print some simple frame info 58 print frame 59 function = frame.GetFunction() 60 # See if we have debug info (a function) 61 if function.IsValid(): 62 # We do have a function, print some info for the function 63 print function 64 # Now get all instructions for this function and print them 65 insts = function.GetInstructions(target) 66 disassemble_instructions (insts) 67 else: 68 # See if we have a symbol in the symbol table for where we stopped 69 symbol = frame.GetSymbol(); 70 if symbol.IsValid(): 71 # We do have a symbol, print some info for the symbol 72 print symbol 73 # Now get all instructions for this symbol and print them 74 insts = symbol.GetInstructions(target) 75 disassemble_instructions (insts) 76 77 print "Frame registers:" 78 registerList = frame.GetRegisters() 79 numRegisterSets = registerList.GetSize() 80 for i in range (0, numRegisterSets): 81 value = registerList.GetValueAtIndex(i) 82 print value 83 numChildren = value.GetNumChildren() 84 if numChildren > 0: 85 for j in range (0, numChildren): 86 child = value.GetChildAtIndex(j) 87 print "Name: ", child.GetName(), " Value: ", child.GetValue(frame) 88 89 print "Hit the breakpoint at main, continue and wait for program to exit..." 90 # Now continue to the program exit 91 process.Continue() 92 # When we return from the above function we will hopefully be at the 93 # program exit. Print out some process info 94 print process 95 elif state == lldb.eStateExited: 96 print "Didn't hit the breakpoint at main, program has exited..." 97 else: 98 print "Unexpected process state: %s, killing process..." % debugger.StateAsCString (state) 99 process.Kill() 100 101 102 103lldb.SBDebugger.Terminate() 104