Skip to content

Commit

Permalink
bpo-46600: Fix test_gdb.test_pycfunction() for clang -Og (pythonGH-31058
Browse files Browse the repository at this point in the history
)

Fix test_gdb.test_pycfunction() for Python built with clang -Og.
Tolerate inlined functions in the gdb traceback.

When _testcapimodule.c is built by clang -Og, _null_to_none() is
inlined in meth_varargs() and so gdb returns _null_to_none() as
the frame #1. If it's not inlined, meth_varargs() is the frame #1.
  • Loading branch information
vstinner authored Feb 1, 2022
1 parent f78be59 commit bebaa95
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 11 deletions.
25 changes: 14 additions & 11 deletions Lib/test/test_gdb.py
Original file line number Diff line number Diff line change
Expand Up @@ -897,15 +897,19 @@ def test_gc(self):
# to suppress these. See also the comment in DebuggerTests.get_stack_trace
def test_pycfunction(self):
'Verify that "py-bt" displays invocations of PyCFunction instances'
# bpo-46600: If the compiler inlines _null_to_none() in meth_varargs()
# (ex: clang -Og), _null_to_none() is the frame #1. Otherwise,
# meth_varargs() is the frame #1.
expected_frame = r'#(1|2)'
# Various optimizations multiply the code paths by which these are
# called, so test a variety of calling conventions.
for func_name, args, expected_frame in (
('meth_varargs', '', 1),
('meth_varargs_keywords', '', 1),
('meth_o', '[]', 1),
('meth_noargs', '', 1),
('meth_fastcall', '', 1),
('meth_fastcall_keywords', '', 1),
for func_name, args in (
('meth_varargs', ''),
('meth_varargs_keywords', ''),
('meth_o', '[]'),
('meth_noargs', ''),
('meth_fastcall', ''),
('meth_fastcall_keywords', ''),
):
for obj in (
'_testcapi',
Expand Down Expand Up @@ -945,10 +949,9 @@ def bar():
# defined.' message in stderr.
ignore_stderr=True,
)
self.assertIn(
f'#{expected_frame} <built-in method {func_name}',
gdb_output,
)
regex = expected_frame
regex += re.escape(f' <built-in method {func_name}')
self.assertRegex(gdb_output, regex)

@unittest.skipIf(python_is_optimized(),
"Python was compiled with optimizations")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Fix test_gdb.test_pycfunction() for Python built with ``clang -Og``.
Tolerate inlined functions in the gdb traceback. Patch by Victor Stinner.

0 comments on commit bebaa95

Please sign in to comment.