diff Tools/gdb/libpython.py @ 60664:d7d5c76545fb legacy-trunk

Issue #8279: Fix test_gdb failures.
author Martin v. Löwis <martin@v.loewis.de>
date Sat, 17 Apr 2010 22:40:40 +0000
parents 6de3de3ab71f
children 86d08cb6ba5c
line wrap: on
line diff
--- a/Tools/gdb/libpython.py	Sat Apr 17 21:59:26 2010 +0000
+++ b/Tools/gdb/libpython.py	Sat Apr 17 22:40:40 2010 +0000
@@ -1097,6 +1097,11 @@
 register (gdb.current_objfile ())
 
 
+
+# Unfortunately, the exact API exposed by the gdb module varies somewhat
+# from build to build
+# See http://bugs.python.org/issue8279?#msg102276
+
 class Frame(object):
     '''
     Wrapper for gdb.Frame, adding various methods
@@ -1119,7 +1124,16 @@
             return None
 
     def select(self):
+        '''If supported, select this frame and return True; return False if unsupported
+
+        Not all builds have a gdb.Frame.select method; seems to be present on Fedora 12
+        onwards, but absent on Ubuntu buildbot'''
+        if not hasattr(self._gdbframe, 'select'):
+            print ('Unable to select frame: '
+                   'this build of gdb does not expose a gdb.Frame.select method')
+            return False
         self._gdbframe.select()
+        return True
 
     def get_index(self):
         '''Calculate index of frame, starting at 0 for the newest frame within
@@ -1133,8 +1147,9 @@
         return index
 
     def is_evalframeex(self):
+        '''Is this a PyEval_EvalFrameEx frame?'''
         if self._gdbframe.function():
-            if self._gdbframe.function().name == 'PyEval_EvalFrameEx':
+            if self._gdbframe.name() == 'PyEval_EvalFrameEx':
                 '''
                 I believe we also need to filter on the inline
                 struct frame_id.inline_depth, only regarding frames with
@@ -1271,8 +1286,8 @@
 
         if iter_frame.is_evalframeex():
             # Result:
-            iter_frame.select()
-            iter_frame.print_summary()
+            if iter_frame.select():
+                iter_frame.print_summary()
             return
 
         frame = iter_frame