[Python-checkins] [3.6] bpo-30983: [gdb] Fix py-bt, etc. for non-debug shared builds (GH-3153) (#3192)
Łukasz Langa
webhook-mailer at python.org
Tue Aug 22 16:20:43 EDT 2017
https://github.com/python/cpython/commit/8e572491b59c2334723bfd7411ab2a9fbd100f70
commit: 8e572491b59c2334723bfd7411ab2a9fbd100f70
branch: 3.6
author: Łukasz Langa <lukasz at langa.pl>
committer: GitHub <noreply at github.com>
date: 2017-08-22T13:20:40-07:00
summary:
[3.6] bpo-30983: [gdb] Fix py-bt, etc. for non-debug shared builds (GH-3153) (#3192)
PEP 523 introduced _PyEval_EvalFrameDefault which inlines PyEval_EvalFrameEx on
non-debug shared builds. This breaks the ability to use py-bt, py-up, and
a few other Python-specific gdb integrations.
This patch fixes the problem by only looking for _PyEval_EvalFrameDefault
frames.
test_gdb passes on both a debug and a non-debug build.
Original patch by Bruno "Polaco" Penteado.
(cherry picked from commit 5fe59f8e3a0a56a155c18f9d581205ec533764b6)
files:
A Misc/NEWS.d/next/Tools-Demos/2017-08-18-17-19-23.bpo-30983.ggGz9z.rst
M Misc/ACKS
M Tools/gdb/libpython.py
diff --git a/Misc/ACKS b/Misc/ACKS
index 20e174384ba..a67eb0a557e 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -1171,6 +1171,7 @@ Berker Peksag
Andreas Pelme
Steven Pemberton
Bo Peng
+Bruno "Polaco" Penteado
Santiago Peresón
George Peristerakis
Thomas Perl
diff --git a/Misc/NEWS.d/next/Tools-Demos/2017-08-18-17-19-23.bpo-30983.ggGz9z.rst b/Misc/NEWS.d/next/Tools-Demos/2017-08-18-17-19-23.bpo-30983.ggGz9z.rst
new file mode 100644
index 00000000000..404263e9ac8
--- /dev/null
+++ b/Misc/NEWS.d/next/Tools-Demos/2017-08-18-17-19-23.bpo-30983.ggGz9z.rst
@@ -0,0 +1,6 @@
+gdb integration commands (py-bt, etc.) work on optimized shared builds now,
+too. PEP 523 introduced _PyEval_EvalFrameDefault which inlines
+PyEval_EvalFrameEx on non-debug shared builds. This broke the ability to
+use py-bt, py-up, and a few other Python-specific gdb integrations. The
+problem is fixed by only looking for _PyEval_EvalFrameDefault frames in
+python-gdb.py. Original patch by Bruno "Polaco" Penteado.
diff --git a/Tools/gdb/libpython.py b/Tools/gdb/libpython.py
index 31ae8117c78..aac9b5c1b8a 100755
--- a/Tools/gdb/libpython.py
+++ b/Tools/gdb/libpython.py
@@ -99,6 +99,8 @@ def _sizeof_void_p():
ENCODING = locale.getpreferredencoding()
+EVALFRAME = '_PyEval_EvalFrameDefault'
+
class NullPyObjectPtr(RuntimeError):
pass
@@ -1492,18 +1494,18 @@ def get_index(self):
# - everything else
def is_python_frame(self):
- '''Is this a PyEval_EvalFrameEx frame, or some other important
+ '''Is this a _PyEval_EvalFrameDefault frame, or some other important
frame? (see is_other_python_frame for what "important" means in this
context)'''
- if self.is_evalframeex():
+ if self.is_evalframe():
return True
if self.is_other_python_frame():
return True
return False
- def is_evalframeex(self):
- '''Is this a PyEval_EvalFrameEx frame?'''
- if self._gdbframe.name() == 'PyEval_EvalFrameEx':
+ def is_evalframe(self):
+ '''Is this a _PyEval_EvalFrameDefault frame?'''
+ if self._gdbframe.name() == EVALFRAME:
'''
I believe we also need to filter on the inline
struct frame_id.inline_depth, only regarding frames with
@@ -1512,7 +1514,7 @@ def is_evalframeex(self):
So we reject those with type gdb.INLINE_FRAME
'''
if self._gdbframe.type() == gdb.NORMAL_FRAME:
- # We have a PyEval_EvalFrameEx frame:
+ # We have a _PyEval_EvalFrameDefault frame:
return True
return False
@@ -1631,7 +1633,7 @@ def get_selected_bytecode_frame(cls):
frame = cls.get_selected_frame()
while frame:
- if frame.is_evalframeex():
+ if frame.is_evalframe():
return frame
frame = frame.older()
@@ -1639,7 +1641,7 @@ def get_selected_bytecode_frame(cls):
return None
def print_summary(self):
- if self.is_evalframeex():
+ if self.is_evalframe():
pyop = self.get_pyop()
if pyop:
line = pyop.get_truncated_repr(MAX_OUTPUT_LEN)
@@ -1658,7 +1660,7 @@ def print_summary(self):
sys.stdout.write('#%i\n' % self.get_index())
def print_traceback(self):
- if self.is_evalframeex():
+ if self.is_evalframe():
pyop = self.get_pyop()
if pyop:
pyop.print_traceback()
More information about the Python-checkins
mailing list