| #!/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 time |
| |
| def disassemble_instructions (insts): |
| for i in range(0, insts.GetSize()): |
| print insts.GetInstructionAtIndex(i) |
| |
| # Initialize LLDB so we can use it |
| lldb.SBDebugger.Initialize() |
| |
| # 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 |
| target = debugger.CreateTargetWithFileAndArch (sys.argv[1], "x86_64") |
| |
| if target.IsValid(): |
| # If the target is valid set a breakpoint at main |
| main_bp = target.BreakpointCreateByName ("main", "a.out"); |
| |
| # Launch the process. Since we specified synchronous mode, we won't return |
| # from this function until we hit the breakpoint at main |
| process = target.LaunchProcess (sys.argv[2:], [''], "dev/stdout", 0, False) |
| |
| # Make sure the launch went ok |
| if process.IsValid(): |
| # Print some simple process info |
| print "process:", process, "\n" |
| # Get the first thread |
| thread = process.GetThreadAtIndex (0) |
| if thread.IsValid(): |
| # Print some simple thread info |
| print "thread: ", thread |
| # Get the first frame |
| frame = thread.GetFrameAtIndex (0) |
| if frame.IsValid(): |
| # Print some simple frame info |
| print "frame: ", frame |
| function = frame.GetFunction() |
| # See if we have debug info (a function) |
| if function.IsValid(): |
| # We do have a function, print some info for the function |
| print "function: ", function, "\n" |
| # 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.IsValid(): |
| # We do have a symbol, print some info for the symbol |
| print "symbol: ", symbol, "\n" |
| # Now get all instructions for this symbol and print them |
| insts = symbol.GetInstructions(target) |
| disassemble_instructions (insts) |
| # 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:", process, "\n" |
| |
| |
| lldb.SBDebugger.Terminate() |