blob: c7abdfd37368ab839969f81c20af24a18f6ce265 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
import gdb
import weenix
class Stack:
def __init__(self, gdbframe=None):
if (gdbframe == None):
gdbframe = gdb.newest_frame()
self._frames = []
while (None != gdbframe):
self._frames.append(weenix.stack.Frame(gdbframe))
gdbframe = gdbframe.older()
def contains(self, fname):
for frame in self._frames:
if (frame._func == fname):
return True
return False
def __str__(self):
res = ""
for i, frame in enumerate(self._frames):
res += "#{0:<2} {1}\n".format(i, str(frame))
return res
class Frame:
def __init__(self, gdbframe):
self._func = "???" if gdbframe.name() == None else gdbframe.name()
self._pc = gdbframe.find_sal().pc
self._symtab = gdbframe.find_sal()
self._args = {}
if (gdbframe.function() != None):
gdbframe.select()
argstr = gdb.execute("info args", to_string=True)
for line in argstr.split("\n"):
parts = line.split("=", 1)
if (len(parts) == 2):
self._args[parts[0].strip()] = parts[1].strip()
def args(self):
return self._args
def __str__(self, line=0):
if (self._symtab.symtab == None):
res = "0x{1:>08x} ?? ()".format(line, self._pc)
else:
hasargs = False
res = "0x{1:>08x} {2} (".format(line, self._pc, self._func)
for arg in self._args.iterkeys():
hasargs = True
res += arg + "=" + self._args[arg] + ", "
if (hasargs):
res = res[:-2]
res += ") in {0}:{1}".format(self._symtab.symtab.filename, self._symtab.line)
return res
|