python-mss: Test suite sometimes segfaults due to XQueryExtension() getting NULL Display
General information:
- OS name: Gentoo Linux
- OS version: n/a
- OS architecture: amd64
- Resolutions: n/a
- Python version: 3.11.3 (but also reproduced with 3.9.16)
- MSS version: 8.0.3 and git ef97a27cbeae46cbed8f348679cd9729b4755fc0
For GNU/Linux users:
- Display server protocol and version, if known: Xvfb from xorg-server 21.1.8
- Desktop Environment: n/a
- Composite Window Manager name and version: n/a
Description of the warning/error
When running the test suite under Xvfb, various tests sometimes cause it to segfault seemingly randomly, e.g.:
$ python -m pytest
========================================================= test session starts =========================================================
platform linux -- Python 3.11.3, pytest-7.3.1, pluggy-1.0.0 -- /tmp/python-mss/.venv/bin/python
cachedir: .pytest_cache
rootdir: /tmp/python-mss
configfile: setup.cfg
plugins: cov-4.0.0
collected 73 items / 1 skipped
src/tests/test_bgra_to_rgb.py::test_bad_length PASSED [ 1%]
src/tests/test_bgra_to_rgb.py::test_good_types PASSED [ 2%]
src/tests/test_cls_image.py::test_custom_cls_image PASSED [ 4%]
src/tests/test_find_monitors.py::test_get_monitors PASSED [ 5%]
src/tests/test_find_monitors.py::test_keys_aio PASSED [ 6%]
src/tests/test_find_monitors.py::test_keys_monitor_1 PASSED [ 8%]
src/tests/test_find_monitors.py::test_dimensions PASSED [ 9%]
src/tests/test_get_pixels.py::test_grab_monitor PASSED [ 10%]
src/tests/test_get_pixels.py::test_grab_part_of_screen Fatal Python error: Segmentation fault
Current thread 0x00007f4df6e3c740 (most recent call first):
File "/tmp/python-mss/src/mss/linux.py", line 359 in _is_extension_enabled
File "/tmp/python-mss/src/mss/linux.py", line 321 in __init__
File "/tmp/python-mss/src/mss/factory.py", line 34 in mss
File "/tmp/python-mss/src/tests/test_get_pixels.py", line 25 in test_grab_part_of_screen
File "/tmp/python-mss/.venv/lib/python3.11/site-packages/_pytest/python.py", line 194 in pytest_pyfunc_call
File "/tmp/python-mss/.venv/lib/python3.11/site-packages/pluggy/_callers.py", line 39 in _multicall
File "/tmp/python-mss/.venv/lib/python3.11/site-packages/pluggy/_manager.py", line 80 in _hookexec
File "/tmp/python-mss/.venv/lib/python3.11/site-packages/pluggy/_hooks.py", line 265 in __call__
File "/tmp/python-mss/.venv/lib/python3.11/site-packages/_pytest/python.py", line 1799 in runtest
File "/tmp/python-mss/.venv/lib/python3.11/site-packages/_pytest/runner.py", line 169 in pytest_runtest_call
File "/tmp/python-mss/.venv/lib/python3.11/site-packages/pluggy/_callers.py", line 39 in _multicall
File "/tmp/python-mss/.venv/lib/python3.11/site-packages/pluggy/_manager.py", line 80 in _hookexec
File "/tmp/python-mss/.venv/lib/python3.11/site-packages/pluggy/_hooks.py", line 265 in __call__
File "/tmp/python-mss/.venv/lib/python3.11/site-packages/_pytest/runner.py", line 262 in <lambda>
File "/tmp/python-mss/.venv/lib/python3.11/site-packages/_pytest/runner.py", line 341 in from_call
File "/tmp/python-mss/.venv/lib/python3.11/site-packages/_pytest/runner.py", line 261 in call_runtest_hook
File "/tmp/python-mss/.venv/lib/python3.11/site-packages/_pytest/runner.py", line 222 in call_and_report
File "/tmp/python-mss/.venv/lib/python3.11/site-packages/_pytest/runner.py", line 133 in runtestprotocol
File "/tmp/python-mss/.venv/lib/python3.11/site-packages/_pytest/runner.py", line 114 in pytest_runtest_protocol
File "/tmp/python-mss/.venv/lib/python3.11/site-packages/pluggy/_callers.py", line 39 in _multicall
File "/tmp/python-mss/.venv/lib/python3.11/site-packages/pluggy/_manager.py", line 80 in _hookexec
File "/tmp/python-mss/.venv/lib/python3.11/site-packages/pluggy/_hooks.py", line 265 in __call__
File "/tmp/python-mss/.venv/lib/python3.11/site-packages/_pytest/main.py", line 348 in pytest_runtestloop
File "/tmp/python-mss/.venv/lib/python3.11/site-packages/pluggy/_callers.py", line 39 in _multicall
File "/tmp/python-mss/.venv/lib/python3.11/site-packages/pluggy/_manager.py", line 80 in _hookexec
File "/tmp/python-mss/.venv/lib/python3.11/site-packages/pluggy/_hooks.py", line 265 in __call__
File "/tmp/python-mss/.venv/lib/python3.11/site-packages/_pytest/main.py", line 323 in _main
File "/tmp/python-mss/.venv/lib/python3.11/site-packages/_pytest/main.py", line 269 in wrap_session
File "/tmp/python-mss/.venv/lib/python3.11/site-packages/_pytest/main.py", line 316 in pytest_cmdline_main
File "/tmp/python-mss/.venv/lib/python3.11/site-packages/pluggy/_callers.py", line 39 in _multicall
File "/tmp/python-mss/.venv/lib/python3.11/site-packages/pluggy/_manager.py", line 80 in _hookexec
File "/tmp/python-mss/.venv/lib/python3.11/site-packages/pluggy/_hooks.py", line 265 in __call__
File "/tmp/python-mss/.venv/lib/python3.11/site-packages/_pytest/config/__init__.py", line 166 in main
File "/tmp/python-mss/.venv/lib/python3.11/site-packages/_pytest/config/__init__.py", line 189 in console_main
File "/tmp/python-mss/.venv/lib/python3.11/site-packages/pytest/__main__.py", line 5 in <module>
File "<frozen runpy>", line 88 in _run_code
File "<frozen runpy>", line 198 in _run_module_as_main
Extension modules: numpy.core._multiarray_umath, numpy.core._multiarray_tests, numpy.linalg._umath_linalg, numpy.fft._pocketfft_internal, numpy.random._common, numpy.random.bit_generator, numpy.random._bounded_integers, numpy.random._mt19937, numpy.random.mtrand, numpy.random._philox, numpy.random._pcg64, numpy.random._sfc64, numpy.random._generator, PIL._imaging (total: 14)
Segmentation fault (core dumped)
gdb suggests that XQueryExtension() is receiving a NULL pointer as display:
#0 __pthread_kill_implementation (threadid=<optimized out>, signo=signo@entry=11, no_tid=no_tid@entry=0) at pthread_kill.c:44
#1 0x00007f4df66a38df in __pthread_kill_internal (signo=11, threadid=<optimized out>) at pthread_kill.c:78
#2 0x00007f4df6653af2 in __GI_raise (sig=11) at ../sysdeps/posix/raise.c:26
#3 <signal handler called>
#4 XQueryExtension (dpy=0x0, name=0x7f4dd24e2870 "RANDR", major_opcode=0x7f4dd247e920, first_event=0x7f4dd247ea40,
first_error=0x7f4dd247e800) at /usr/src/debug/x11-libs/libX11-1.8.4-r1/libX11-1.8.4/src/QuExt.c:48
#5 0x00007f4df521228a in ?? () from /usr/lib64/libffi.so.8
#6 0x00007f4df52116a4 in ?? () from /usr/lib64/libffi.so.8
#7 0x00007f4df5211dfd in ffi_call () from /usr/lib64/libffi.so.8
#8 0x00007f4df5255060 in ?? () from /usr/lib/python3.11/lib-dynload/_ctypes.cpython-311-x86_64-linux-gnu.so
#9 0x00007f4df524e388 in ?? () from /usr/lib/python3.11/lib-dynload/_ctypes.cpython-311-x86_64-linux-gnu.so
#10 0x00007f4df694ec0b in _PyObject_MakeTpCall () from /usr/lib64/libpython3.11.so.1.0
#11 0x00007f4df68fdeb0 in _PyEval_EvalFrameDefault () from /usr/lib64/libpython3.11.so.1.0
[…]
This seems to be some ugly race condition, I’m trying to investigate further.
Other details
I’m testing via:
python -m venv .venv
. .venv/bin/activate
pip install -r tests-requirements.txt
export DISPLAY=:1
Xvfb :1 &
python -m pytest
About this issue
- Original URL
- State: closed
- Created a year ago
- Comments: 20 (20 by maintainers)
Good argument about the removal from Gentoo, you should have started with that 😉