xref: /llvm-project/lldb/examples/python/disasm.py (revision 406ef962d94c9d8e1984a87e5adda586c966e85a)
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