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"):
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"):
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"):
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"):
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"):
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"):
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"):
191 sal = frame.find_sal()
198 """ Return the gdb.Frame underpinning this frame decorator.""" 202 if hasattr(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
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.""" 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.""" 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)