Skip to content

Instantly share code, notes, and snippets.

@xieyu
Created July 4, 2012 11:28
Show Gist options
  • Select an option

  • Save xieyu/3046870 to your computer and use it in GitHub Desktop.

Select an option

Save xieyu/3046870 to your computer and use it in GitHub Desktop.
rewrite addr2name.awk with python
#!/usr/bin/python
import subprocess
import sys
import re
import os
import string
def getSymbolsMapFromObjectFile(fileName):
output = subprocess.Popen(["nm", fileName], stdout = subprocess.PIPE, cwd = os.getcwd()).stdout.read()
entrys = output.split("\n")
symbolsMap = []
for entry in entrys:
try:
addr, kind, symbol = entry.split(" ")
if kind.lower() == "t":
symbolsMap.append((string.atoi(addr, base=16), symbol))
except:
print entry
symbolsMap.sort(key = lambda x: x[0])
return symbolsMap
def getRawCallstackFromUserInput():
print "please input the raw callstack, press Ctrl-D or Ctrl-C to end input"
rawCallStack = []
addrPattern = re.compile(r"0x[a-f0-9]+", re.IGNORECASE)
while True:
try:
inputLine = raw_input(">")
except:
break
rawCallStack.extend(addrPattern.findall(inputLine))
return rawCallStack
def getNameForAddr(addr, symbolsMap):
low = 0
addr = string.atoi(addr, base=16)
hi = len(symbolsMap) - 1
while hi -1 > low:
mid = (hi + low)/2
if symbolsMap[mid][0] > addr:
hi = mid
else:
low = mid
return symbolsMap[low][1]
def dump(callstack):
print "\ncall stack is:\n"
for line in callstack:
print line
def decodeRawCallStack(rawCallStack, symbolsMap):
return [getNameForAddr(addr, symbolsMap) for addr in rawCallStack]
def main(argc, argv):
objectFileName = os.path.abspath(argv[1])
symbolsMap = getSymbolsMapFromObjectFile(objectFileName)
rawCallStack = getRawCallstackFromUserInput()
callStack = decodeRawCallStack(rawCallStack, symbolsMap)
dump(callStack)
if __name__ == "__main__":
main(len(sys.argv), sys.argv)
pass
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment