2012-07-06 04:24:41 +08:00
#!/usr/bin/python
#----------------------------------------------------------------------
# For the shells csh, tcsh:
# ( setenv PYTHONPATH /Applications/Xcode.app/Contents/SharedFrameworks/LLDB.framework/Resources/Python ; ./globals.py <path> [<path> ...])
#
# For the shells sh, bash:
# PYTHONPATH=/Applications/Xcode.app/Contents/SharedFrameworks/LLDB.framework/Resources/Python ./globals.py <path> [<path> ...]
#----------------------------------------------------------------------
import lldb
import commands
import optparse
import os
import shlex
import sys
def get_globals ( raw_path , options ) :
error = lldb . SBError ( )
# Resolve the path if needed
path = os . path . expanduser ( raw_path )
# Create a target using path + options
target = lldb . debugger . CreateTarget ( path , options . arch , options . platform , False , error )
if target :
# Get the executable module
module = target . module [ target . executable . basename ]
if module :
# Keep track of which variables we have already looked up
global_names = list ( )
# Iterate through all symbols in the symbol table and watch for any DATA symbols
for symbol in module . symbols :
if symbol . type == lldb . eSymbolTypeData :
# The symbol is a DATA symbol, lets try and find all global variables
# that match this name and print them
global_name = symbol . name
# Make sure we don't lookup the same variable twice
if global_name not in global_names :
global_names . append ( global_name )
# Find all global variables by name
global_variable_list = module . FindGlobalVariables ( target , global_name , lldb . UINT32_MAX )
if global_variable_list :
# Print results for anything that matched
for global_variable in global_variable_list :
print ' name = %s ' % global_variable . name # returns the global variable name as a string
print ' value = %s ' % global_variable . value # Returns the variable value as a string
print ' type = %s ' % global_variable . type # Returns an lldb.SBType object
print ' addr = %s ' % global_variable . addr # Returns an lldb.SBAddress (section offset address) for this global
print ' file_addr = 0x %x ' % global_variable . addr . file_addr # Returns the file virtual address for this global
print ' location = %s ' % global_variable . location # returns the global variable value as a string
print ' size = %s ' % global_variable . size # Returns the size in bytes of this global variable
print
def globals ( command_args ) :
''' Extract all globals from any arguments which must be paths to object files. '''
usage = " usage: % prog [options] <PATH> [PATH ...] "
description = ''' This command will find all globals in the specified object file and return an list() of lldb.SBValue objects (which might be empty). '''
parser = optparse . OptionParser ( description = description , prog = ' globals ' , usage = usage )
parser . add_option ( ' -v ' , ' --verbose ' , action = ' store_true ' , dest = ' verbose ' , help = ' display verbose debug info ' , default = False )
parser . add_option ( ' -a ' , ' --arch ' , type = ' string ' , metavar = ' arch ' , dest = ' arch ' , help = ' Specify an architecture (or triple) to use when extracting from a file. ' )
2013-06-27 06:24:05 +08:00
parser . add_option ( ' -p ' , ' --platform ' , type = ' string ' , metavar = ' platform ' , dest = ' platform ' , help = ' Specify the platform to use when creating the debug target. Valid values include " localhost " , " darwin-kernel " , " ios-simulator " , " remote-freebsd " , " remote-macosx " , " remote-ios " , " remote-linux " . ' )
2012-07-06 04:24:41 +08:00
try :
( options , args ) = parser . parse_args ( command_args )
except :
return
for path in args :
get_globals ( path , options )
if __name__ == ' __main__ ' :
lldb . debugger = lldb . SBDebugger . Create ( )
globals ( sys . argv [ 1 : ] )