Pytest: segmentation fault when import mysql connector

Created on 18 Jul 2019  路  8Comments  路  Source: pytest-dev/pytest

test.py

import mysql.connector
from unittest import TestCase
class TestStat(TestCase):
    pass

python -m unittest test.py => OK

python -m pytest test.py => boom!

============================================================================================= test session starts =============================================================================================
platform linux -- Python 3.5.2, pytest-5.0.1, py-1.8.0, pluggy-0.12.0
rootdir: /home/qqqq/testpytest
collecting ... Fatal Python error: Segmentation fault

Current thread 0x00007f4579496700 (most recent call first):
  File "<frozen importlib._bootstrap>", line 222 in _call_with_frames_removed
  File "<frozen importlib._bootstrap_external>", line 906 in create_module
  File "<frozen importlib._bootstrap>", line 577 in module_from_spec
  File "<frozen importlib._bootstrap>", line 666 in _load_unlocked
  File "<frozen importlib._bootstrap>", line 958 in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 969 in _find_and_load
  File "/usr/lib/python3.5/ssl.py", line 98 in <module>
  File "<frozen importlib._bootstrap>", line 222 in _call_with_frames_removed
  File "<frozen importlib._bootstrap_external>", line 665 in exec_module
  File "<frozen importlib._bootstrap>", line 673 in _load_unlocked
  File "<frozen importlib._bootstrap>", line 958 in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 969 in _find_and_load
  File "/home/qqqq/venv/venv3/lib/python3.5/site-packages/mysql/connector/network.py", line 39 in <module>
  File "<frozen importlib._bootstrap>", line 222 in _call_with_frames_removed
  File "<frozen importlib._bootstrap_external>", line 665 in exec_module
  File "<frozen importlib._bootstrap>", line 673 in _load_unlocked
  File "<frozen importlib._bootstrap>", line 958 in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 969 in _find_and_load
  File "/home/qqqq/venv/venv3/lib/python3.5/site-packages/mysql/connector/connection.py", line 50 in <module>
  File "<frozen importlib._bootstrap>", line 222 in _call_with_frames_removed
  File "<frozen importlib._bootstrap_external>", line 665 in exec_module
  File "<frozen importlib._bootstrap>", line 673 in _load_unlocked
  File "<frozen importlib._bootstrap>", line 958 in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 969 in _find_and_load
  File "/home/qqqq/venv/venv3/lib/python3.5/site-packages/mysql/connector/__init__.py", line 42 in <module>
  File "<frozen importlib._bootstrap>", line 222 in _call_with_frames_removed
  File "<frozen importlib._bootstrap_external>", line 665 in exec_module
  File "<frozen importlib._bootstrap>", line 673 in _load_unlocked
  File "<frozen importlib._bootstrap>", line 958 in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 969 in _find_and_load
  File "/home/qqqq/testpytest/test.py", line 1 in <module>
  File "/home/qqqq/venv/venv3/lib/python3.5/site-packages/_pytest/assertion/rewrite.py", line 149 in exec_module
  File "<frozen importlib._bootstrap>", line 673 in _load_unlocked
  File "<frozen importlib._bootstrap>", line 958 in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 969 in _find_and_load
  File "/home/qqqq/venv/venv3/lib/python3.5/site-packages/py/_path/local.py", line 701 in pyimport
  File "/home/qqqq/venv/venv3/lib/python3.5/site-packages/_pytest/python.py", line 498 in _importtestmodule
  File "/home/qqqq/venv/venv3/lib/python3.5/site-packages/_pytest/python.py", line 431 in _getobj
  File "/home/qqqq/venv/venv3/lib/python3.5/site-packages/_pytest/python.py", line 250 in obj
  File "/home/qqqq/venv/venv3/lib/python3.5/site-packages/_pytest/python.py", line 446 in _inject_setup_module_fixture
  File "/home/qqqq/venv/venv3/lib/python3.5/site-packages/_pytest/python.py", line 434 in collect
  File "/home/qqqq/venv/venv3/lib/python3.5/site-packages/_pytest/runner.py", line 247 in <lambda>
  File "/home/qqqq/venv/venv3/lib/python3.5/site-packages/_pytest/runner.py", line 220 in from_call
  File "/home/qqqq/venv/venv3/lib/python3.5/site-packages/_pytest/runner.py", line 247 in pytest_make_collect_report
  File "/home/qqqq/venv/venv3/lib/python3.5/site-packages/pluggy/callers.py", line 187 in _multicall
  File "/home/qqqq/venv/venv3/lib/python3.5/site-packages/pluggy/manager.py", line 81 in <lambda>
  File "/home/qqqq/venv/venv3/lib/python3.5/site-packages/pluggy/manager.py", line 87 in _hookexec
  File "/home/qqqq/venv/venv3/lib/python3.5/site-packages/pluggy/hooks.py", line 289 in __call__
  File "/home/qqqq/venv/venv3/lib/python3.5/site-packages/_pytest/runner.py", line 368 in collect_one_node
  File "/home/qqqq/venv/venv3/lib/python3.5/site-packages/_pytest/main.py", line 717 in genitems
  File "/home/qqqq/venv/venv3/lib/python3.5/site-packages/_pytest/main.py", line 498 in _perform_collect
  File "/home/qqqq/venv/venv3/lib/python3.5/site-packages/_pytest/main.py", line 459 in perform_collect
  File "/home/qqqq/venv/venv3/lib/python3.5/site-packages/_pytest/main.py", line 266 in pytest_collection
  File "/home/qqqq/venv/venv3/lib/python3.5/site-packages/pluggy/callers.py", line 187 in _multicall
  File "/home/qqqq/venv/venv3/lib/python3.5/site-packages/pluggy/manager.py", line 81 in <lambda>
  File "/home/qqqq/venv/venv3/lib/python3.5/site-packages/pluggy/manager.py", line 87 in _hookexec
  File "/home/qqqq/venv/venv3/lib/python3.5/site-packages/pluggy/hooks.py", line 289 in __call__
  File "/home/qqqq/venv/venv3/lib/python3.5/site-packages/_pytest/main.py", line 256 in _main
  File "/home/qqqq/venv/venv3/lib/python3.5/site-packages/_pytest/main.py", line 213 in wrap_session
  File "/home/qqqq/venv/venv3/lib/python3.5/site-packages/_pytest/main.py", line 250 in pytest_cmdline_main
  File "/home/qqqq/venv/venv3/lib/python3.5/site-packages/pluggy/callers.py", line 187 in _multicall
  File "/home/qqqq/venv/venv3/lib/python3.5/site-packages/pluggy/manager.py", line 81 in <lambda>
  File "/home/qqqq/venv/venv3/lib/python3.5/site-packages/pluggy/manager.py", line 87 in _hookexec
  File "/home/qqqq/venv/venv3/lib/python3.5/site-packages/pluggy/hooks.py", line 289 in __call__
  File "/home/qqqq/venv/venv3/lib/python3.5/site-packages/_pytest/config/__init__.py", line 74 in main
  File "/home/qqqq/venv/venv3/lib/python3.5/site-packages/pytest.py", line 102 in <module>
  File "/usr/lib/python3.5/runpy.py", line 85 in _run_code
  File "/usr/lib/python3.5/runpy.py", line 184 in _run_module_as_main
Segmentation fault (core dumped)

system information

Ubuntu 16.04.5 LTS \n \l
Package                Version
---------------------- ----------
appdirs                1.4.3
asn1crypto             0.24.0
atomicwrites           1.3.0
attrs                  18.2.0
Automat                0.7.0
backcall               0.1.0
beautifulsoup4         4.7.1
boto3                  1.9.156
botocore               1.12.156
certifi                2018.11.29
cffi                   1.11.5
chardet                3.0.4
colorama               0.4.1
constantly             15.1.0
cryptography           2.4.2
cssselect              1.0.3
decorator              4.3.0
docutils               0.14
future                 0.17.1
hyperlink              18.0.0
idna                   2.8
importlib-metadata     0.18
incremental            17.5.0
ipython                7.2.0
ipython-genutils       0.2.0
jedi                   0.13.2
jmespath               0.9.4
lxml                   4.3.0
more-itertools         7.1.0
mysql-connector-python 8.0.16
packaging              19.0
parso                  0.3.1
pathlib2               2.3.4
pexpect                4.6.0
pickleshare            0.7.5
pip                    19.0.3
pkg-resources          0.0.0
pluggy                 0.12.0
prompt-toolkit         2.0.7
protobuf               3.9.0
ptyprocess             0.6.0
py                     1.8.0
pycparser              2.19
Pygments               2.3.1
PyHamcrest             1.9.0
pyparsing              2.4.0
pytest                 5.0.1
python-dateutil        2.8.0
python-telegram-bot    11.1.0
queuelib               1.5.0
redis                  3.2.0
requests               2.21.0
s3transfer             0.2.0
selenium               3.141.0
setuptools             40.6.3
six                    1.12.0
soupsieve              1.7
telegram-send          0.20
traitlets              4.3.2
urllib3                1.24.1
wcwidth                0.1.7
wheel                  0.32.3
zipp                   0.5.2
zope.interface         4.6.0
You are using pip version 19.0.3, however version 19.1.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

Most helpful comment

@agnelvishal memory layout is sometimes a part of a segfault, a change in import order, or loaded structures may trigger, this is probably why it didn't show on unittest, but showed on pytest - a difference in loaded modules

All 8 comments

I can't seem to reproduce this. Does it work if you launch pytest with --assert=plain?

Edit: Reproduced in an Ubuntu 16.04 docker container. --assert=plain doesn't change anything. I can't seem to get a C stacktrace via gdb though.

@The-Compiler can you share your dockerfile? in order to strace / gdb in docker you need to run the container with --privileged

I'm aware - I did docker run --privileged -it ubuntu:16.04 and inside the container something like:

  • apt update
  • apt upgrade
  • apt install python3
  • pip3 install pytest mysql-connector-python

Here's the backtrace:

Program received signal SIGSEGV, Segmentation fault.
0x0000000000019616 in ?? ()
(gdb) bt
#0  0x0000000000019616 in ?? ()
#1  0x00007ffff39cc519 in SSL_load_error_strings ()
   from /usr/local/lib/python3.5/dist-packages/mysql-vendor/libssl.so.1.0.0
#2  0x00007ffff309f03b in PyInit(short, short, long) ()
   from /usr/lib/python3.5/lib-dynload/_ssl.cpython-35m-x86_64-linux-gnu.so
#3  0x000000000061091e in _PyImport_LoadDynamicModuleWithSpec ()
#4  0x0000000000610e08 in ?? ()
#5  0x00000000004ea1c6 in PyCFunction_Call ()
#6  0x000000000053d353 in PyEval_EvalFrameEx ()
#7  0x000000000053fc97 in ?? ()
#8  0x000000000053bc93 in PyEval_EvalFrameEx ()
#9  0x000000000053b294 in PyEval_EvalFrameEx ()
#10 0x000000000053b294 in PyEval_EvalFrameEx ()
#11 0x000000000053b294 in PyEval_EvalFrameEx ()
#12 0x000000000053b294 in PyEval_EvalFrameEx ()
#13 0x0000000000540b0b in PyEval_EvalCodeEx ()
#14 0x00000000004ec2e3 in ?? ()
#15 0x00000000005c20e7 in PyObject_Call ()
#16 0x00000000005c2f1a in _PyObject_CallMethodIdObjArgs ()
#17 0x0000000000525c08 in PyImport_ImportModuleLevelObject ()
#18 0x0000000000549ae8 in ?? ()
#19 0x00000000004ea137 in PyCFunction_Call ()
#20 0x00000000005c20e7 in PyObject_Call ()

it appears to be due to the following:

root@ed15a4ec2fa2:/# ls /usr/local/lib/python3.5/dist-packages/mysql-vendor/
libcrypto.so.1.0.0  libssl.so.1.0.0

here's a reproduction without pytest, please take this to the mysql connector folks:

root@ed15a4ec2fa2:/# python3 -c 'import hashlib; import mysql.connector'
Segmentation fault (core dumped)

A very very very hacky workaround:

root@ed15a4ec2fa2:/# rm -rf /usr/local/lib/python3.5/dist-packages/mysql-vendor/
root@ed15a4ec2fa2:/# python3 -c 'import hashlib; import mysql.connector'
root@ed15a4ec2fa2:/# 

great analysis

For me, this did not work

import schedule
import mysql.connector as mariadb

But changing the order worked

import mysql.connector as mariadb
import schedule

@agnelvishal memory layout is sometimes a part of a segfault, a change in import order, or loaded structures may trigger, this is probably why it didn't show on unittest, but showed on pytest - a difference in loaded modules

@agnelvishal I changed the order too and it worked. Could you tell me the reason behind this ?

Was this page helpful?
0 / 5 - 0 ratings