blob: e7f482ffa66ea71451d1084f4b657e470ef80b1d [file] [log] [blame]
Greg Clayton1a3083a2010-10-06 03:53:16 +00001#!/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):
Johnny Chene3c81e02010-10-09 00:15:46 +000017 for i in range(insts.GetSize()):
Greg Clayton1a3083a2010-10-06 03:53:16 +000018 print insts.GetInstructionAtIndex(i)
19
Greg Clayton1a3083a2010-10-06 03:53:16 +000020# 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
Greg Claytond8c62532010-10-07 04:19:01 +000028print "Creating a target for '%s'" % sys.argv[1]
29
30target = debugger.CreateTargetWithFileAndArch (sys.argv[1], lldb.LLDB_ARCH_DEFAULT)
Greg Clayton1a3083a2010-10-06 03:53:16 +000031
32if target.IsValid():
33 # If the target is valid set a breakpoint at main
Jim Inghambb737102011-03-30 01:55:23 +000034 main_bp = target.BreakpointCreateByName ("main", target.GetExecutable().GetFilename());
Greg Claytond8c62532010-10-07 04:19:01 +000035
36 print main_bp
37
Greg Clayton1a3083a2010-10-06 03:53:16 +000038 # Launch the process. Since we specified synchronous mode, we won't return
39 # from this function until we hit the breakpoint at main
Jim Inghambb737102011-03-30 01:55:23 +000040 error = lldb.SBError()
41 process = target.Launch (debugger.GetListener(), None, None, os.ctermid(), os.ctermid(), os.ctermid(), None, 0, False, error)
Greg Clayton1a3083a2010-10-06 03:53:16 +000042
43 # Make sure the launch went ok
44 if process.IsValid():
45 # Print some simple process info
Greg Claytond8c62532010-10-07 04:19:01 +000046 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)
Greg Clayton1a3083a2010-10-06 03:53:16 +000066 disassemble_instructions (insts)
Greg Claytond8c62532010-10-07 04:19:01 +000067 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)
Jim Inghambb737102011-03-30 01:55:23 +000076
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
Greg Claytond8c62532010-10-07 04:19:01 +000089 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
Greg Clayton1a3083a2010-10-06 03:53:16 +0000101
102
103lldb.SBDebugger.Terminate()