3 import sys
, re
, os
.path
5 from optparse
import OptionParser
8 def __init__(self
, vmlinux
, prefix
= ''):
9 self
.a2l
= subprocess
.Popen(['addr2line', '-fe', vmlinux
],
10 stdin
= subprocess
.PIPE
,
11 stdout
= subprocess
.PIPE
,
12 stderr
= subprocess
.PIPE
,
16 def resolve(self
, addr
):
17 self
.a2l
.stdin
.write('%08x\n' % addr
)
18 symbol
= self
.a2l
.stdout
.readline().strip()
19 file = self
.a2l
.stdout
.readline().strip()
22 if file.startswith(self
.prefix
):
23 file = file[len(self
.prefix
):]
27 def __init__(self
, resolvers
):
28 self
.resolvers
= resolvers
29 def resolve(self
, addr
):
30 for resolver
in self
.resolvers
:
31 ret
= resolver
.resolve(addr
)
36 def __init__(self
, resolver
):
37 self
.resolver
= resolver
39 def resolve(self
, addr
):
40 if not self
.cache
.has_key(addr
):
41 self
.cache
[addr
] = self
.resolver
.resolve(addr
)
42 return self
.cache
[addr
]
44 optparser
= OptionParser()
45 optparser
.add_option('-g', '--guest', dest
='guest', action
='store_true',
47 help='interpret kernel addresses as guest (default)')
48 optparser
.add_option('-H', '--host', dest
='guest', action
='store_false',
49 help='interpret kernel addresses as host')
50 (options
, args
) = optparser
.parse_args()
53 basedir
= re
.sub(r
'(.*/kvm)(/.*)', r
'\1', basedir
)
55 addr_re
= re
.compile(r
'\b[0-9a-fA-F]{8,16}\b')
57 linux
= Addr2line(basedir
+ '/qemu/vmlinux',
58 basedir
+ '/qemu/linux/')
60 linux
= Addr2line(basedir
+ '/kernel/vmlinux',
61 basedir
+ '/kernel/linux/')
62 addr2line
= Cache(linux
)
64 def expand_addr(addr
):
66 result
= addr2line
.resolve(int(addr
, 16))
68 (symbol
, file) = result
69 return '%s %s(%s)' % (addr
, symbol
, file)
74 for line
in sys
.stdin
:
75 line
= addr_re
.sub(expand_addr
, line
)
77 except KeyboardInterrupt: