diff options
Diffstat (limited to 'python/weenix/stack.py')
-rw-r--r-- | python/weenix/stack.py | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/python/weenix/stack.py b/python/weenix/stack.py new file mode 100644 index 0000000..c7abdfd --- /dev/null +++ b/python/weenix/stack.py @@ -0,0 +1,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 |