addr2line.py 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. #!/usr/bin/env python
  2. import sys, os, subprocess, env_setup
  3. def ex(cmd):
  4. return subprocess.Popen([ 'bash', '-c', cmd ], stdout = subprocess.PIPE).communicate()[0]
  5. class Addr2Line:
  6. def __init__(self, objname, marker_addr = 0, marker_name = '_Z5rdtscv'):
  7. self.bin = objname
  8. if marker_addr == 0:
  9. self.offset = 0
  10. else:
  11. base = eval('0x' + ex('nm %s | grep %s' % (self.bin, marker_name)).split()[0])
  12. text = eval('0x' + ex(r'objdump -h %s | grep "\.text"' % self.bin).split()[5])
  13. self.offset = marker_addr - base
  14. self.cache = {}
  15. def addr2line(self, a):
  16. a = long(a)
  17. if a < self.offset:
  18. return ('??', '??', '??')
  19. if a not in self.cache:
  20. res = ex('addr2line -Csfe %s %x' % (self.bin, a - self.offset))
  21. function, file = res.split('\n', 1)
  22. function = function.split('(')[0]
  23. file, line = file.split(':')
  24. self.cache[a] = (file, function, line.strip())
  25. return self.cache[a]
  26. if __name__ == '__main__':
  27. if len(sys.argv) < 2:
  28. print 'Usage: addr2line.py <address-of-rdtsc> [<address-to-resolve> ]*'
  29. sys.exit(1)
  30. a2l = Addr2Line(os.path.join(env_setup.sim_root(), 'lib', 'pin_sim.so'), long(sys.argv[1]))
  31. for addr in sys.argv[2:]:
  32. print ':'.join(a2l(long(addr)))