繁体   English   中英

requests.request 上的分段错误

[英]Segmentation fault on requests.request

在使用 python 请求库连接到 Twitter 的 v2 API 端点后,我遇到了分段错误。

该请求是在生成器 object 中的单独线程上创建的

class TwitterStream:
    def __init__():
        self.response = self.build_response()    

    def build_response():
        response = requests.request("GET", url, headers, stream=True)
        if response.status_code != 200:
            raise Exception("Exception")
        for record in response.iter_lines():
            yield record

    def __next__():
        return next(self.response)

然后在执行线程上,我使用 ThreadPoolExecutor 来获取每个响应行:

record_future = threadpoolexecutor.submit(next, TwitterStreamObjectInstance)
if record_future.done():
   # do stuff  with record_future.result()

我一直在response = requests.request("GET", url, headers, stream=True)行遇到分段错误,我很确定,基于大量的print()调试。

我尝试了 gdb 调试方法,并取回了这个堆栈跟踪——我假设 libssl.so.1 导致了这个问题,但我真的不知道如何进一步调查。

#0  0x000000000001d85e in ?? ()
#1  0x00007ffff406ffa0 in OPENSSL_init_ssl () from /mnt/d/Projects/EBKA/edna_env/lib/python3.7/site-packages/mysql/vendor/libssl.so.1.1
#2  0x00007ffff4074be3 in SSL_CTX_new () from /mnt/d/Projects/EBKA/edna_env/lib/python3.7/site-packages/mysql/vendor/libssl.so.1.1
#3  0x00007ffff43c855d in ?? () from /usr/lib/python3.7/lib-dynload/_ssl.cpython-37m-x86_64-linux-gnu.so
#4  0x00005555556c9ff2 in ?? ()
#5  0x00005555556857d0 in _PyMethodDef_RawFastCallKeywords ()
#6  0x0000555555685560 in _PyCFunction_FastCallKeywords ()
#7  0x00005555556fa4e4 in _PyEval_EvalFrameDefault ()
#8  0x00005555556f4e2f in _PyEval_EvalCodeWithName ()
#9  0x0000555555687591 in _PyObject_Call_Prepend ()
#10 0x00005555556c9e3c in ?? ()
#11 0x00005555556c5ce5 in ?? ()
#12 0x0000555555685f72 in _PyObject_FastCallKeywords ()
#13 0x00005555556fa00d in _PyEval_EvalFrameDefault ()
#14 0x00005555556f4e2f in _PyEval_EvalCodeWithName ()
#15 0x0000555555686efa in _PyFunction_FastCallKeywords ()
#16 0x00005555556f6b0a in _PyEval_EvalFrameDefault ()
#17 0x0000555555686e1a in _PyFunction_FastCallKeywords ()
.
.
.
#58 0x00005555555c5d24 in _PyFunction_FastCallDict ()
#59 0x00005555556f73d0 in _PyEval_EvalFrameDefault ()
#60 0x0000555555686e1a in _PyFunction_FastCallKeywords ()
#61 0x00005555556f5fde in _PyEval_EvalFrameDefault ()
#62 0x0000555555686e1a in _PyFunction_FastCallKeywords ()
#63 0x00005555556f5fde in _PyEval_EvalFrameDefault ()
#64 0x0000555555687359 in _PyObject_Call_Prepend ()
#65 0x00005555556879b8 in PyObject_Call ()
#66 0x0000555555800193 in ?? ()
#67 0x00005555557c30d7 in ?? ()
#68 0x00007ffff7bbb6db in start_thread (arg=0x7fffd0f92700) at pthread_create.c:463
#69 0x00007ffff6cf071f in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95

附注 - 我在关闭线程时遇到问题,我得到以下信息

libgcc_s.so.1 must be installed for pthread_cancel to work

我得到的一个建议是在执行开始时执行以下操作:

import ctypes
libgcc_s = ctypes.CDLL('libgcc_s.so.1')

但这没有用。 我提到这个的原因是因为在我尝试这个之后,我一直收到“找不到 libssl”的错误,我不确定它是否相关。

根据我的经验, OPENSSL_init_ssl中的崩溃通常是由于将libssl.so.xy的多个版本(或多个实例)链接到单个进程中造成的。

在崩溃点使用 GDB info shared libssl

如果您看到多个版本,那很可能是根本原因。

如果你不这样做,你的一些二进制文件仍然有可能链接到libssl.a中。 对于每个二进制文件(主python可执行文件和info shared输出中的每个共享库),运行nm -A python lib1.so lib2.so... | grep OPENSSL nm -A python lib1.so lib2.so... | grep OPENSSL

如果唯一匹配的库是/mnt/d/Projects/EBKA/edna_env/lib/python3.7/site-packages/mysql/vendor/libssl.so.1.1 ,那么肯定还有其他根本原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM