28 """Basic implementation of a Frame Decorator"""
30 """ This base frame decorator decorates a frame or another frame
31 decorator, and provides convenience methods. If this object is
32 wrapping a frame decorator, defer to that wrapped object's method
33 if it has one. This allows for frame decorators that have
34 sub-classed FrameDecorator object, but also wrap other frame
35 decorators on the same frame to correctly execute.
39 If the result of frame filters running means we have one gdb.Frame
40 wrapped by multiple frame decorators, all sub-classed from
41 FrameDecorator, the resulting hierarchy will be:
45 -- (wraps) FrameDecorator
48 In this case we have two frame decorators, both of which are
49 sub-classed from FrameDecorator. If Decorator1 just overrides the
50 'function' method, then all of the other methods are carried out
51 by the super-class FrameDecorator. But Decorator2 may have
52 overriden other methods, so FrameDecorator will look at the
53 'base' parameter and defer to that class's methods. And so on,
65 """Internal utility to determine if the frame is special or
67 sal = frame.find_sal()
69 if (
not sal.symtab
or not sal.symtab.filename
70 or frame.type() == gdb.DUMMY_FRAME
71 or frame.type() == gdb.SIGTRAMP_FRAME):
78 """Return any elided frames that this class might be
80 if hasattr(self.
_base,
"elided"):
81 return self._base.elided()
86 """ Return the name of the frame's function or an address of
87 the function of the frame. First determine if this is a
88 special frame. If not, try to determine filename from GDB's
89 frame internal function API. Finally, if a name cannot be
90 determined return the address. If this function returns an
91 address, GDB will attempt to determine the function name from
92 its internal minimal symbols store (for example, for inferiors
93 without debug-info)."""
97 if not isinstance(self.
_base, gdb.Frame):
98 if hasattr(self.
_base,
"function"):
101 return self._base.function()
105 if frame.type() == gdb.DUMMY_FRAME:
106 return "<function called from gdb>"
107 elif frame.type() == gdb.SIGTRAMP_FRAME:
108 return "<signal handler called>"
110 func = frame.function()
123 """ Return the address of the frame's pc"""
125 if hasattr(self.
_base,
"address"):
126 return self._base.address()
132 """ Return the filename associated with this frame, detecting
133 and returning the appropriate library name is this is a shared
136 if hasattr(self.
_base,
"filename"):
137 return self._base.filename()
140 sal = frame.find_sal()
141 if not sal.symtab
or not sal.symtab.filename:
143 return gdb.solib_name(pc)
145 return sal.symtab.filename
148 """ Return an iterable of frame arguments for this frame, if
149 any. The iterable object contains objects conforming with the
150 Symbol/Value interface. If there are no frame arguments, or
151 if this frame is deemed to be a special case, return None."""
153 if hasattr(self.
_base,
"frame_args"):
154 return self._base.frame_args()
161 return args.fetch_frame_args()
164 """ Return an iterable of local variables for this frame, if
165 any. The iterable object contains objects conforming with the
166 Symbol/Value interface. If there are no frame locals, or if
167 this frame is deemed to be a special case, return None."""
169 if hasattr(self.
_base,
"frame_locals"):
170 return self._base.frame_locals()
177 return args.fetch_frame_locals()
180 """ Return line number information associated with the frame's
181 pc. If symbol table/line information does not exist, or if
182 this frame is deemed to be a special case, return None"""
184 if hasattr(self.
_base,
"line"):
185 return self._base.line()
191 sal = frame.find_sal()
198 """ Return the gdb.Frame underpinning this frame decorator."""
202 if hasattr(self.
_base,
"inferior_frame"):
203 return self._base.inferior_frame()
207 """A container class conforming to the Symbol/Value interface
208 which holds frame locals or frame arguments."""
214 """ Return the value associated with this symbol, or None"""
218 """ Return the symbol, or Python text, associated with this
224 """Utility class to fetch and store frame local variables, or
230 gdb.SYMBOL_LOC_STATIC:
True,
231 gdb.SYMBOL_LOC_REGISTER:
True,
232 gdb.SYMBOL_LOC_ARG:
True,
233 gdb.SYMBOL_LOC_REF_ARG:
True,
234 gdb.SYMBOL_LOC_LOCAL:
True,
235 gdb.SYMBOL_LOC_REGPARM_ADDR:
True,
236 gdb.SYMBOL_LOC_COMPUTED:
True
240 """ Local utility method to determine if according to Symbol
241 type whether it should be included in the iterator. Not all
242 symbols are fetched, and only symbols that return
243 True from this method should be fetched."""
248 if isinstance(sym, basestring):
251 sym_type = sym.addr_class
253 return self.symbol_class.get(sym_type,
False)
256 """Public utility method to fetch frame local variables for
257 the stored frame. Frame arguments are not fetched. If there
258 are no frame local variables, return an empty list."""
262 block = self.frame.block()
267 if block.is_global
or block.is_static:
275 block = block.superblock
280 """Public utility method to fetch frame arguments for the
281 stored frame. Frame arguments are the only type fetched. If
282 there are no frame argument variables, return an empty list."""
287 block = self.frame.block()
292 if block.function !=
None:
294 block = block.superblock
298 if not sym.is_argument:
def __init__(self, symbol, value)
def fetch_frame_args(self)
def _is_limited_frame(frame)
def fetch_frame_locals(self)
def __init__(self, frame)