00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 import gobject
00030 import gtk
00031 from base import Base
00032
00033 class Stack(Base):
00034 """
00035 Stack Trace View
00036 """
00037 __gsignals__ = {
00038 "selection-changed" : (
00039 gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (
00040 gobject.TYPE_PYOBJECT,
00041 gobject.TYPE_PYOBJECT,) )
00042 }
00043 def __init__(self, tree):
00044 Base.__init__(self)
00045 self.__trace = None
00046 self.__thread = None
00047
00048
00049 self.__model = gtk.ListStore(
00050 gobject.TYPE_PYOBJECT,
00051 gobject.TYPE_STRING,
00052 gobject.TYPE_STRING,
00053 gobject.TYPE_STRING)
00054
00055 if tree:
00056 tree.set_model(self.__model)
00057 renderer = gtk.CellRendererText()
00058 tree.append_column(gtk.TreeViewColumn("Address", renderer, text=1))
00059 tree.append_column(gtk.TreeViewColumn("Location", renderer, text=2))
00060 tree.append_column(gtk.TreeViewColumn("Function", renderer, text=3))
00061 tree.get_column(0).set_resizable(True)
00062 tree.get_column(1).set_resizable(True)
00063 tree.get_selection().connect("changed", self.on_selection_changed)
00064 tree.get_selection().set_mode(gtk.SELECTION_SINGLE)
00065
00066
00067 def update(self, event):
00068 self.__thread = event.thread()
00069 self.__trace = event.thread().stack_trace()
00070 model = self.__model
00071 model.clear()
00072 for frame in self.__trace.frames():
00073 iter = model.append()
00074 model.set_value(iter, 0, frame)
00075 model.set_value(iter, 1, hex(frame.program_count()))
00076 sym = frame.function()
00077 if sym:
00078 if sym.line():
00079 s = "%s:%d" % (sym.filename(), sym.line())
00080 else:
00081 s = sym.filename()
00082 model.set_value(iter, 2, s)
00083 model.set_value(iter, 3, sym.demangle())
00084
00085
00086 def clear(self):
00087 self.__model.clear()
00088
00089
00090 def on_selection_changed(self, sel):
00091
00092
00093
00094
00095
00096 model, iter = sel.get_selected()
00097 if iter:
00098 frame = model.get_value(iter, 0)
00099 if frame:
00100 self.__trace.select_frame(frame.index())
00101 self.emit('selection-changed', self.__thread, frame)
00102
00103
00104 gobject.type_register(Stack)