簡體   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