aboutsummaryrefslogtreecommitdiff
path: root/python/weenix/stack.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/weenix/stack.py')
-rw-r--r--python/weenix/stack.py56
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