[Python-checkins] [3.9] bpo-45838: Fix incorrect line numbers in Tools/gdb/libpython.py (GH-29628)
ambv
webhook-mailer at python.org
Fri Nov 19 13:53:55 EST 2021
https://github.com/python/cpython/commit/2a32dbf110cf80ec9a00290ea6bc84f409948cb0
commit: 2a32dbf110cf80ec9a00290ea6bc84f409948cb0
branch: 3.9
author: Sam Gross <colesbury at gmail.com>
committer: ambv <lukasz at langa.pl>
date: 2021-11-19T19:53:46+01:00
summary:
[3.9] bpo-45838: Fix incorrect line numbers in Tools/gdb/libpython.py (GH-29628)
The line number calculation in libpython.py did not properly handle
negative (signed) line table deltas.
files:
A Misc/NEWS.d/next/Tools-Demos/2021-11-18-11-20-21.bpo-45838.TH6mwc.rst
M Lib/test/test_gdb.py
M Tools/gdb/libpython.py
diff --git a/Lib/test/test_gdb.py b/Lib/test/test_gdb.py
index 5f554897f86a0..b3aa855a5bd5e 100644
--- a/Lib/test/test_gdb.py
+++ b/Lib/test/test_gdb.py
@@ -955,6 +955,31 @@ def __init__(self):
self.assertRegex(gdb_output,
r"<method-wrapper u?'__init__' of MyList object at ")
+ @unittest.skipIf(python_is_optimized(),
+ "Python was compiled with optimizations")
+ def test_try_finally_lineno(self):
+ cmd = textwrap.dedent('''
+ def foo(x):
+ try:
+ raise RuntimeError("error")
+ return x
+ except:
+ id("break point")
+ finally:
+ x += 2
+ return x
+ r = foo(3)
+ ''')
+ gdb_output = self.get_stack_trace(cmd,
+ cmds_after_breakpoint=["py-bt"])
+ self.assertMultilineMatches(gdb_output,
+ r'''^.*
+Traceback \(most recent call first\):
+ <built-in method id of module object .*>
+ File "<string>", line 7, in foo
+ File "<string>", line 11, in <module>
+''')
+
class PyPrintTests(DebuggerTests):
@unittest.skipIf(python_is_optimized(),
diff --git a/Misc/NEWS.d/next/Tools-Demos/2021-11-18-11-20-21.bpo-45838.TH6mwc.rst b/Misc/NEWS.d/next/Tools-Demos/2021-11-18-11-20-21.bpo-45838.TH6mwc.rst
new file mode 100644
index 0000000000000..b6dafc5c3edc4
--- /dev/null
+++ b/Misc/NEWS.d/next/Tools-Demos/2021-11-18-11-20-21.bpo-45838.TH6mwc.rst
@@ -0,0 +1 @@
+Fix line number calculation when debugging Python with GDB.
diff --git a/Tools/gdb/libpython.py b/Tools/gdb/libpython.py
index aeaa63e540d8b..45be5ab9bb9b3 100755
--- a/Tools/gdb/libpython.py
+++ b/Tools/gdb/libpython.py
@@ -659,7 +659,10 @@ def addr2line(self, addrq):
addr += ord(addr_incr)
if addr > addrq:
return lineno
- lineno += ord(line_incr)
+ line_delta = ord(line_incr)
+ if line_delta >= 128:
+ line_delta -= 256
+ lineno += line_delta
return lineno
More information about the Python-checkins
mailing list