3 # ----------------------------------------------------------------------
4 # Be sure to add the python path that points to the LLDB shared library.
6 # setenv PYTHONPATH /Developer/Library/PrivateFrameworks/LLDB.framework/Resources/Python
8 # export PYTHONPATH=/Developer/Library/PrivateFrameworks/LLDB.framework/Resources/Python
9 # ----------------------------------------------------------------------
16 def disassemble_instructions(insts
):
22 print("Usage: disasm.py [-n name] executable-image")
23 print(" By default, it breaks at and disassembles the 'main' function.")
27 if len(sys
.argv
) == 2:
30 elif len(sys
.argv
) == 4:
31 if sys
.argv
[1] != "-n":
39 # Create a new debugger instance
40 debugger
= lldb
.SBDebugger
.Create()
42 # When we step or continue, don't return from the function until the process
43 # stops. We do this by setting the async mode to false.
44 debugger
.SetAsync(False)
46 # Create a target from a file and arch
47 print("Creating a target for '%s'" % exe
)
49 target
= debugger
.CreateTargetWithFileAndArch(exe
, lldb
.LLDB_ARCH_DEFAULT
)
52 # If the target is valid set a breakpoint at main
53 main_bp
= target
.BreakpointCreateByName(fname
, target
.GetExecutable().GetFilename())
57 # Launch the process. Since we specified synchronous mode, we won't return
58 # from this function until we hit the breakpoint at main
59 process
= target
.LaunchSimple(None, None, os
.getcwd())
61 # Make sure the launch went ok
63 # Print some simple process info
64 state
= process
.GetState()
66 if state
== lldb
.eStateStopped
:
67 # Get the first thread
68 thread
= process
.GetThreadAtIndex(0)
70 # Print some simple thread info
73 frame
= thread
.GetFrameAtIndex(0)
75 # Print some simple frame info
77 function
= frame
.GetFunction()
78 # See if we have debug info (a function)
80 # We do have a function, print some info for the
83 # Now get all instructions for this function and print
85 insts
= function
.GetInstructions(target
)
86 disassemble_instructions(insts
)
88 # See if we have a symbol in the symbol table for where
90 symbol
= frame
.GetSymbol()
92 # We do have a symbol, print some info for the
95 # Now get all instructions for this symbol and
97 insts
= symbol
.GetInstructions(target
)
98 disassemble_instructions(insts
)
100 registerList
= frame
.GetRegisters()
102 "Frame registers (size of register set = %d):"
103 % registerList
.GetSize()
105 for value
in registerList
:
108 "%s (number of children = %d):"
109 % (value
.GetName(), value
.GetNumChildren())
113 "Name: ", child
.GetName(), " Value: ", child
.GetValue()
117 "Hit the breakpoint at main, enter to continue and wait for program to exit or 'Ctrl-D'/'quit' to terminate the program"
119 next
= sys
.stdin
.readline()
120 if not next
or next
.rstrip("\n") == "quit":
121 print("Terminating the inferior process...")
124 # Now continue to the program exit
126 # When we return from the above function we will hopefully be at the
127 # program exit. Print out some process info
129 elif state
== lldb
.eStateExited
:
130 print("Didn't hit the breakpoint at main, program has exited...")
133 "Unexpected process state: %s, killing process..."
134 % debugger
.StateAsCString(state
)
139 lldb
.SBDebugger
.Terminate()