]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - examples/python/disasm.py
Vendor import of lldb trunk r256945:
[FreeBSD/FreeBSD.git] / examples / python / disasm.py
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
11 import lldb
12 import os
13 import sys
14
15 def disassemble_instructions (insts):
16     for i in insts:
17         print i
18
19 def usage():
20     print "Usage: disasm.py [-n name] executable-image"
21     print "       By default, it breaks at and disassembles the 'main' function."
22     sys.exit(0)
23
24 if len(sys.argv) == 2:
25     fname = 'main'
26     exe = sys.argv[1]
27 elif len(sys.argv) == 4:
28     if sys.argv[1] != '-n':
29         usage()
30     else:
31         fname = sys.argv[2]
32         exe = sys.argv[3]
33 else:
34     usage()
35
36 # Create a new debugger instance
37 debugger = lldb.SBDebugger.Create()
38
39 # When we step or continue, don't return from the function until the process 
40 # stops. We do this by setting the async mode to false.
41 debugger.SetAsync (False)
42
43 # Create a target from a file and arch
44 print "Creating a target for '%s'" % exe
45
46 target = debugger.CreateTargetWithFileAndArch (exe, lldb.LLDB_ARCH_DEFAULT)
47
48 if target:
49     # If the target is valid set a breakpoint at main
50     main_bp = target.BreakpointCreateByName (fname, target.GetExecutable().GetFilename());
51
52     print main_bp
53
54     # Launch the process. Since we specified synchronous mode, we won't return
55     # from this function until we hit the breakpoint at main
56     process = target.LaunchSimple (None, None, os.getcwd())
57     
58     # Make sure the launch went ok
59     if process:
60         # Print some simple process info
61         state = process.GetState ()
62         print process
63         if state == lldb.eStateStopped:
64             # Get the first thread
65             thread = process.GetThreadAtIndex (0)
66             if thread:
67                 # Print some simple thread info
68                 print thread
69                 # Get the first frame
70                 frame = thread.GetFrameAtIndex (0)
71                 if frame:
72                     # Print some simple frame info
73                     print frame
74                     function = frame.GetFunction()
75                     # See if we have debug info (a function)
76                     if function:
77                         # We do have a function, print some info for the function
78                         print function
79                         # Now get all instructions for this function and print them
80                         insts = function.GetInstructions(target)
81                         disassemble_instructions (insts)
82                     else:
83                         # See if we have a symbol in the symbol table for where we stopped
84                         symbol = frame.GetSymbol();
85                         if symbol:
86                             # We do have a symbol, print some info for the symbol
87                             print symbol
88                             # Now get all instructions for this symbol and print them
89                             insts = symbol.GetInstructions(target)
90                             disassemble_instructions (insts)
91
92                     registerList = frame.GetRegisters()
93                     print "Frame registers (size of register set = %d):" % registerList.GetSize()
94                     for value in registerList:
95                         #print value
96                         print "%s (number of children = %d):" % (value.GetName(), value.GetNumChildren())
97                         for child in value:
98                             print "Name: ", child.GetName(), " Value: ", child.GetValue()
99
100             print "Hit the breakpoint at main, enter to continue and wait for program to exit or 'Ctrl-D'/'quit' to terminate the program"
101             next = sys.stdin.readline()
102             if not next or next.rstrip('\n') == 'quit':
103                 print "Terminating the inferior process..."
104                 process.Kill()
105             else:
106                 # Now continue to the program exit
107                 process.Continue()
108                 # When we return from the above function we will hopefully be at the
109                 # program exit. Print out some process info
110                 print process
111         elif state == lldb.eStateExited:
112             print "Didn't hit the breakpoint at main, program has exited..."
113         else:
114             print "Unexpected process state: %s, killing process..." % debugger.StateAsCString (state)
115             process.Kill()
116
117         
118
119 lldb.SBDebugger.Terminate()