Wrapper for gdb.Frame, adding various methods
| 1712 | # See http://bugs.python.org/issue8279?#msg102276 |
| 1713 | |
| 1714 | class Frame(object): |
| 1715 | ''' |
| 1716 | Wrapper for gdb.Frame, adding various methods |
| 1717 | ''' |
| 1718 | def __init__(self, gdbframe): |
| 1719 | self._gdbframe = gdbframe |
| 1720 | |
| 1721 | def older(self): |
| 1722 | older = self._gdbframe.older() |
| 1723 | if older: |
| 1724 | return Frame(older) |
| 1725 | else: |
| 1726 | return None |
| 1727 | |
| 1728 | def newer(self): |
| 1729 | newer = self._gdbframe.newer() |
| 1730 | if newer: |
| 1731 | return Frame(newer) |
| 1732 | else: |
| 1733 | return None |
| 1734 | |
| 1735 | def select(self): |
| 1736 | '''If supported, select this frame and return True; return False if unsupported |
| 1737 | |
| 1738 | Not all builds have a gdb.Frame.select method; seems to be present on Fedora 12 |
| 1739 | onwards, but absent on Ubuntu buildbot''' |
| 1740 | if not hasattr(self._gdbframe, 'select'): |
| 1741 | print ('Unable to select frame: ' |
| 1742 | 'this build of gdb does not expose a gdb.Frame.select method') |
| 1743 | return False |
| 1744 | self._gdbframe.select() |
| 1745 | return True |
| 1746 | |
| 1747 | def get_index(self): |
| 1748 | '''Calculate index of frame, starting at 0 for the newest frame within |
| 1749 | this thread''' |
| 1750 | index = 0 |
| 1751 | # Go down until you reach the newest frame: |
| 1752 | iter_frame = self |
| 1753 | while iter_frame.newer(): |
| 1754 | index += 1 |
| 1755 | iter_frame = iter_frame.newer() |
| 1756 | return index |
| 1757 | |
| 1758 | # We divide frames into: |
| 1759 | # - "python frames": |
| 1760 | # - "bytecode frames" i.e. PyEval_EvalFrameEx |
| 1761 | # - "other python frames": things that are of interest from a python |
| 1762 | # POV, but aren't bytecode (e.g. GC, GIL) |
| 1763 | # - everything else |
| 1764 | |
| 1765 | def is_python_frame(self): |
| 1766 | '''Is this a _PyEval_EvalFrameDefault frame, or some other important |
| 1767 | frame? (see is_other_python_frame for what "important" means in this |
| 1768 | context)''' |
| 1769 | if self.is_evalframe(): |
| 1770 | return True |
| 1771 | if self.is_other_python_frame(): |
no outgoing calls
no test coverage detected
searching dependent graphs…