Debian Stretch의 세그폴트

Debian Stretch의 세그폴트

세그폴트, 그런데 왜? 이는 debian:stretch+mysql.connector+tox 및 Python3.x에서만 발생합니다. 재생산하는 데 몇 줄만 필요합니다.

FROM debian:stretch
RUN apt update -y && apt install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev gcc wget tox vim python-pip python3-pip
RUN wget https://www.python.org/ftp/python/3.6.9/Python-3.6.9.tgz
RUN tar xvf Python-3.6.9.tgz && cd Python-3.6.9 &&./configure --enable-optimizations --enable-shared --with-ssl --with-ensurepip=install && make -j8 && make altinstall
RUN mkdir /tox-test && echo "[tox]" >> /tox-test/tox.ini && echo "envlist = py36" >> /tox-test/tox.ini && echo "[testenv]" >> /tox-test/tox.ini && echo "deps=" >> /tox-test/tox.ini
RUN echo "  mysql-connector-python" >> /tox-test/tox.ini && echo "commands=python3.6 setup.py test" >> /tox-test/tox.ini
RUN mkdir /tox-test/tests && touch /tox-test/tests/__init__.py && echo "import faulthandler\nfaulthandler.enable()\nimport mysql.connector as mysql" >> /tox-test/tests/test_segfault.py
RUN echo "mysql.connect(host='localhost', user='joe', password='bloggs')" >> /tox-test/tests/test_segfault.py
RUN mkdir /tox-test/foo && echo "print('foo')" >> /tox-test/foo/foo.py
RUN echo "from setuptools import setup" >> /tox-test/setup.py && echo "setup( name='foo',version='1.0',description='A module',author='Niklas R.',author_email='[email protected]',packages=['foo'],test_suite='tests',)" >> /tox-test/setup.py
RUN cd /tox-test && export LD_LIBRARY_PATH=/Python-3.6.9 && tox

위의 내용으로 인해 세그폴트가 발생했습니다. Ubuntu 및 Debian Jessie의 경우 작동하거나 해결할 수 있습니다. Stretch에서 왜 이런 일이 발생하는지 이해할 수 없으며 해결할 수도 없습니다. "localhost" 대신 "127.0.0.1"을 쓰면 충돌이 발생하지 않기 때문에 segfault는 네트워크와 관련된 것 같습니다. 이해하도록 도와주세요. 내 생각엔 가져오기가 SSL 또는 이와 유사한 자체 버전을 숨기거나 사용하고 있는 것 같습니다. 이것은 매우 말도 안되는 일입니다. 우분투에서도 재현 가능하며 더 이상한 이야기는 우분투에서 werkzeug.exceptions import BadRequestKeyErrorPython을 가져오지 않고 추가하고 사용하지 않고 가져오면 세그폴트가 수정된다는 것입니다. mysql-connector-python을 PyMySQL로 바꾸면 작동합니다. 따라서 이는 mysql-connector-python의 내용이어야 합니다. 이 커넥터에 대한 유사한 버그 보고서가 있습니다.https://bugs.mysql.com/bug.php?id=97220

문자열 "localhost"를 "127.0.0.1"로 변경하면 더 이상 세그폴트가 없습니다.

FROM debian:stretch
RUN apt update -y && apt install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev gcc wget tox vim python-pip python3-pip
RUN wget https://www.python.org/ftp/python/3.6.9/Python-3.6.9.tgz
RUN tar xvf Python-3.6.9.tgz && cd Python-3.6.9 &&./configure --enable-optimizations --enable-shared --with-ssl --with-ensurepip=install && make -j8 && make altinstall
RUN mkdir /tox-test && echo "[tox]" >> /tox-test/tox.ini && echo "envlist = py36" >> /tox-test/tox.ini && echo "[testenv]" >> /tox-test/tox.ini && echo "deps=" >> /tox-test/tox.ini
RUN echo "  mysql-connector-python" >> /tox-test/tox.ini && echo "commands=python3.6 setup.py test" >> /tox-test/tox.ini
RUN mkdir /tox-test/tests && touch /tox-test/tests/__init__.py && echo "import faulthandler\nfaulthandler.enable()\nimport mysql.connector as mysql" >> /tox-test/tests/test_segfault.py
RUN echo "mysql.connect(host='127.0.0.1', user='joe', password='bloggs')" >> /tox-test/tests/test_segfault.py
RUN mkdir /tox-test/foo && echo "print('foo')" >> /tox-test/foo/foo.py
RUN echo "from setuptools import setup" >> /tox-test/setup.py && echo "setup( name='foo',version='1.0',description='A module',author='Niklas R.',author_email='[email protected]',packages=['foo'],test_suite='tests',)" >> /tox-test/setup.py
RUN cd /tox-test && export LD_LIBRARY_PATH=/Python-3.6.9 && tox

답변1

처음에는 소켓 문제처럼 보였지만, Socket.gethostbyname(host_name)은 작동합니다. 좀 더 조사한 후에 문제가 "mysql-connector-python"에 국한된 것을 발견했으며 tox.ini에서 "mysql-connector-python-rf"로 변경하면 오류가 사라집니다. 이는 mysql-connector-python의 어딘가에서 DNS를 IP로 확인할 수 없음을 의미합니다.

관련 정보