Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gh-91960: Skip test_gdb if gdb cannot retrive Python frames #108999

Merged
merged 1 commit into from
Sep 6, 2023

Conversation

vstinner
Copy link
Member

@vstinner vstinner commented Sep 6, 2023

When Python is built with "clang -Og", gdb can fail to retrive the 'frame' parameter of _PyEval_EvalFrameDefault(). In this case, tests like py_bt() are likely to fail. Without getting access to Python frames, python-gdb.py is mostly clueless on retrieving the Python traceback.

@vstinner
Copy link
Member Author

vstinner commented Sep 6, 2023

Without my PR, test on FreeBSD 13.2 with clang version 14.0.5: FAILURE

  • git clean -fdx; ./configure --with-pydebug && make clean && make && ./python -m test -v test_gdb -u all
  • Total tests: run=46 failures=4 skipped=9

Tests with my PR.

Linux, clang 16

Test on Linux, Fedora 38 with clang version 16.0.6 (Fedora 16.0.6-2.fc38):

  • clang -Og: SUCCESS with... 41 skipped tests on 46 :-)

    • git clean -fdx; ./configure --with-pydebug && make clean && make && ./python -m test -v test_gdb -u all
    • Total tests: run=46 skipped=41
  • clang -O0: SUCCESS with only 1 test skipped!

    • git clean -fdx; ./configure --with-pydebug CFLAGS="-O0" && make clean && make && ./python -m test -v test_gdb -u all
    • Total tests: run=46 skipped=1
    • test_print_after_up() is skipped because of: "Unable to read information on python frame"

FreeBSD, clang 14

Test on FreeBSD 13.2 with clang version 14.0.5:

  • clang -Og: SUCCESS with... 41 skipped tests on 46 :-)

    • git clean -fdx; ./configure --with-pydebug && make clean && make && ./python -m test -v test_gdb -u all
    • Total tests: run=46 skipped=41
  • clang -O0: SUCCESS with only 1 test skipped!

  • git clean -fdx; ./configure --with-pydebug CFLAGS="-O0" && make clean && make && ./python -m test -v test_gdb -u all

  • Total tests: run=46 skipped=1

Skip test_gdb if gdb is unable to retrieve Python frame objects: if a
frame is "<optimized out>". When Python is built with "clang -Og",
gdb can fail to retrive the 'frame' parameter of
_PyEval_EvalFrameDefault(). In this case, tests like py_bt() are
likely to fail. Without getting access to Python frames,
python-gdb.py is mostly clueless on retrieving the Python traceback.
Moreover, test_gdb is no longer skipped on macOS if Python is built
with Clang.
@vstinner
Copy link
Member Author

vstinner commented Sep 6, 2023

UPDATE: Moreover, test_gdb is no longer skipped on macOS if Python is built with Clang.

diff --git a/Lib/test/test_gdb.py b/Lib/test/test_gdb.py
index c05a2d387c..ca50574e46 100644
--- a/Lib/test/test_gdb.py
+++ b/Lib/test/test_gdb.py
@@ -55,10 +55,6 @@ def get_gdb_version():
 if not sysconfig.is_python_build():
     raise unittest.SkipTest("test_gdb only works on source builds at the moment.")
 
-if 'Clang' in platform.python_compiler() and sys.platform == 'darwin':
-    raise unittest.SkipTest("test_gdb doesn't work correctly when python is"
-                            " built with LLVM clang")
-
 if ((sysconfig.get_config_var('PGO_PROF_USE_FLAG') or 'xxx') in
     (sysconfig.get_config_var('PY_CORE_CFLAGS') or '')):

@vstinner
Copy link
Member Author

vstinner commented Sep 6, 2023

Test with my PR and clang -O3.

Test on Linux: SUCCESS with only 18 skipped tests on 46, nice!

  • git clean -fdx; ./configure --with-pydebug CC=clang && make clean && make && ./python -m test -v test_gdb -u all
  • Total tests: run=46 skipped=18

Test on FreeBSD: SUCCESS with only 18 skipped tests on 46, nice!

  • git clean -fdx; ./configure && make clean && make && ./python -m test -v test_gdb -u all
  • Total tests: run=46 skipped=18

@vstinner
Copy link
Member Author

vstinner commented Sep 6, 2023

Now I have doubts about my tests on Linux :-( I'm not sure that I passed CC=clang to configure!

I redone my tests on Linux:

  • clang -O0: SUCCESS

    • git clean -fdx; ./configure CC=clang -with-pydebug CFLAGS="-O0" && make clean && make && ./python -m test -v test_gdb -u all
    • Total tests: run=46 skipped=1
    • grep -E '^(CC=|OPT=)' Makefile: CC=clang and OPT=-g -Og -Wall
  • clang -Og: SUCCESS

    • git clean -fdx; ./configure CC=clang -with-pydebug && make clean && make && ./python -m test -v test_gdb -u all
    • Total tests: run=46 skipped=41
    • grep -E '^(CC=|OPT=)' Makefile: CC=clang and OPT=-g -Og -Wall
  • clang -O3: SUCCESS

    • git clean -fdx; ./configure CC=clang && make clean && make && ./python -m test -v test_gdb -u all
    • Total tests: run=46 skipped=18
    • grep -E '^(CC=|OPT=)' Makefile: CC=clang and OPT=-DNDEBUG -g -O3 -Wall

Oh ok, we are safe :-)

@vstinner
Copy link
Member Author

vstinner commented Sep 6, 2023

GitHub Action jobs:

  • Ubuntu: test_gdb passed, Python is built with gcc -g -Og
  • Address sanitizer: "test_gdb passed", Python is built with gcc -DNDEBUG -g -O3
  • macOS: test_gdb skipped -- Couldn't find gdb on the path

@vstinner vstinner enabled auto-merge (squash) September 6, 2023 14:24
@emaste
Copy link
Contributor

emaste commented Sep 6, 2023

Clang just treats -Og as an alias for -O1, so it's not surprising that the debuginfo quality is not as good as GCC's.
llvm/llvm-project@d340ccc

@vstinner vstinner merged commit fbce43a into python:main Sep 6, 2023
17 checks passed
@vstinner vstinner deleted the test_gdb_clang branch September 6, 2023 14:34
@@ -247,6 +243,9 @@ def get_stack_trace(self, source=None, script=None,
for pattern in (
'(frame information optimized out)',
'Unable to read information on python frame',
# gh-91960: On Python built with "clang -Og", gdb gets
# "frame=<optimized out>" for _PyEval_EvalFrameDefault() parameter
'(unable to read python frame information)',
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Any idea why libpython.py prints this rather than "Unable to read information on python frame"? It's possible that there are just some spots that you missed back in #19081

I'm also afraid that this speaks of a fragility of this approach. When optimizations are enabled, it's not easy to predict exactly what is going to be missing. But I'm happy that this allows to re-enable tests on platforms that were entirely ignored.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Any idea why libpython.py prints this rather than "Unable to read information on python frame"? It's possible that there are just some spots that you missed back in #19081

It's likely possible to unify python-gdb.py logs, or use a different regex to match both cases :-) The (unable to read ...) format is for py-bt command. Depending on the command, the log is displayed differently. I took the lazy way of just matching the two strings.

@vstinner vstinner added needs backport to 3.11 only security fixes needs backport to 3.12 bug and security fixes labels Sep 6, 2023
@miss-islington
Copy link
Contributor

Thanks @vstinner for the PR 🌮🎉.. I'm working now to backport this PR to: 3.12.
🐍🍒⛏🤖

@miss-islington
Copy link
Contributor

Thanks @vstinner for the PR 🌮🎉.. I'm working now to backport this PR to: 3.11.
🐍🍒⛏🤖

miss-islington pushed a commit to miss-islington/cpython that referenced this pull request Sep 6, 2023
…thonGH-108999)

Skip test_gdb if gdb is unable to retrieve Python frame objects: if a
frame is "<optimized out>". When Python is built with "clang -Og",
gdb can fail to retrive the 'frame' parameter of
_PyEval_EvalFrameDefault(). In this case, tests like py_bt() are
likely to fail. Without getting access to Python frames,
python-gdb.py is mostly clueless on retrieving the Python traceback.
Moreover, test_gdb is no longer skipped on macOS if Python is built
with Clang.
(cherry picked from commit fbce43a)

Co-authored-by: Victor Stinner <[email protected]>
@bedevere-bot
Copy link

GH-109010 is a backport of this pull request to the 3.12 branch.

miss-islington pushed a commit to miss-islington/cpython that referenced this pull request Sep 6, 2023
…thonGH-108999)

Skip test_gdb if gdb is unable to retrieve Python frame objects: if a
frame is "<optimized out>". When Python is built with "clang -Og",
gdb can fail to retrive the 'frame' parameter of
_PyEval_EvalFrameDefault(). In this case, tests like py_bt() are
likely to fail. Without getting access to Python frames,
python-gdb.py is mostly clueless on retrieving the Python traceback.
Moreover, test_gdb is no longer skipped on macOS if Python is built
with Clang.
(cherry picked from commit fbce43a)

Co-authored-by: Victor Stinner <[email protected]>
@bedevere-bot bedevere-bot removed the needs backport to 3.12 bug and security fixes label Sep 6, 2023
@bedevere-bot
Copy link

GH-109011 is a backport of this pull request to the 3.11 branch.

@bedevere-bot bedevere-bot removed the needs backport to 3.11 only security fixes label Sep 6, 2023
vstinner added a commit that referenced this pull request Sep 6, 2023
…H-108999) (#109011)

gh-91960: Skip test_gdb if gdb cannot retrive Python frames (GH-108999)

Skip test_gdb if gdb is unable to retrieve Python frame objects: if a
frame is "<optimized out>". When Python is built with "clang -Og",
gdb can fail to retrive the 'frame' parameter of
_PyEval_EvalFrameDefault(). In this case, tests like py_bt() are
likely to fail. Without getting access to Python frames,
python-gdb.py is mostly clueless on retrieving the Python traceback.
Moreover, test_gdb is no longer skipped on macOS if Python is built
with Clang.
(cherry picked from commit fbce43a)

Co-authored-by: Victor Stinner <[email protected]>
@vstinner
Copy link
Member Author

vstinner commented Sep 7, 2023

Sadly, this change wasn't enough to fix PPC64LE Fedora Stable Clang 3.x: I created issue #109053.

Yhg1s pushed a commit that referenced this pull request Sep 8, 2023
…H-108999) (#109010)

gh-91960: Skip test_gdb if gdb cannot retrive Python frames (GH-108999)

Skip test_gdb if gdb is unable to retrieve Python frame objects: if a
frame is "<optimized out>". When Python is built with "clang -Og",
gdb can fail to retrive the 'frame' parameter of
_PyEval_EvalFrameDefault(). In this case, tests like py_bt() are
likely to fail. Without getting access to Python frames,
python-gdb.py is mostly clueless on retrieving the Python traceback.
Moreover, test_gdb is no longer skipped on macOS if Python is built
with Clang.
(cherry picked from commit fbce43a)

Co-authored-by: Victor Stinner <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
tests Tests in the Lib/test dir
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants