[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