[Python-checkins] cpython: Update and enhance python-gdb.py

victor.stinner python-checkins at python.org
Wed Jan 18 11:23:53 EST 2017


https://hg.python.org/cpython/rev/127401469628
changeset:   106224:127401469628
user:        Victor Stinner <victor.stinner at gmail.com>
date:        Wed Jan 18 17:20:01 2017 +0100
summary:
  Update and enhance python-gdb.py

Issue #29259:

* Detect PyCFunction is the current frame, not only in the older frame
* Ignore PyCFunction_Call() since it now calls _PyCFunction_FastCallDict(), and
  _PyCFunction_FastCallDict() is already detected

files:
  Lib/test/test_gdb.py   |   2 +-
  Tools/gdb/libpython.py |  26 ++++++++++----------------
  2 files changed, 11 insertions(+), 17 deletions(-)


diff --git a/Lib/test/test_gdb.py b/Lib/test/test_gdb.py
--- a/Lib/test/test_gdb.py
+++ b/Lib/test/test_gdb.py
@@ -845,7 +845,7 @@
                                           breakpoint='time_gmtime',
                                           cmds_after_breakpoint=['py-bt-full'],
                                           )
-        self.assertIn('#0 <built-in method gmtime', gdb_output)
+        self.assertIn('#1 <built-in method gmtime', gdb_output)
 
 
 class PyPrintTests(DebuggerTests):
diff --git a/Tools/gdb/libpython.py b/Tools/gdb/libpython.py
--- a/Tools/gdb/libpython.py
+++ b/Tools/gdb/libpython.py
@@ -1497,15 +1497,17 @@
             return 'Garbage-collecting'
 
         # Detect invocations of PyCFunction instances:
-        older = self.older()
-        if not older:
-            return False
-
-        caller = older._gdbframe.name()
+        frame = self._gdbframe
+        caller = frame.name()
         if not caller:
             return False
 
-        if caller == 'PyCFunction_Call':
+        if caller in ('_PyCFunction_FastCallDict',
+                      '_PyCFunction_FastCallKeywords'):
+            if caller == '_PyCFunction_FastCallKeywords':
+                arg_name = 'func_obj'
+            else:
+                arg_name = 'func'
             # Within that frame:
             #   "func" is the local containing the PyObject* of the
             # PyCFunctionObject instance
@@ -1513,18 +1515,10 @@
             #   "self" is the (PyObject*) of the 'self'
             try:
                 # Use the prettyprinter for the func:
-                func = older._gdbframe.read_var('func')
+                func = frame.read_var(arg_name)
                 return str(func)
             except RuntimeError:
-                return 'PyCFunction invocation (unable to read "func")'
-
-        elif caller in ('_PyCFunction_FastCallDict',
-                        '_PyCFunction_FastCallKeywords'):
-            try:
-                func = older._gdbframe.read_var('func_obj')
-                return str(func)
-            except RuntimeError:
-                return 'PyCFunction invocation (unable to read "func_obj")'
+                return 'PyCFunction invocation (unable to read %s)' % arg_name
 
         # This frame isn't worth reporting:
         return False

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list