[Python] Segmentation Fault During JSON File Open with with open() in Python3.8

Discussão em 'Python' iniciado por Stack, Março 23, 2025.

  1. Stack

    Stack Membro Participativo

    I am encounting a segmentation fault issue in my Python application, which utilizes MQTT to send requests to a service. The service then writes the response into a JSON file, which the application subsequently reads to retrieve the results.

    The problem manifests as a segmentation fault when the application attempts to open this JSON file using with open(). While not consistently reproducible on every function call, this issue occurs reliably after the function executes dozens or hundreds of times consecutively. Specifically, the following code snippet, particularly the line with open(mqtt_response_path, 'r') as file:, appears to be the source of the problem:

    # part of code

    ##########################################################################
    # send request
    logging.info(f'the request info:')
    logging.info(f'{request}')
    send_mqtt(request)


    while True:
    try:
    with open(mqtt_response_path, 'r') as file:
    fcntl.flock(file, fcntl.LOCK_SH)
    json_data = json.load(file)
    if isinstance(json_data, str):
    json_data = json.loads(json_data)
    fcntl.flock(file, fcntl.LOCK_UN)
    # logging.info(f"the return info:{json_data}, the info type{type(json_data)}")
    if json_data['message_id'] == message_id:
    response = json_data
    break
    except (json.JSONDecodeError, FileNotFoundError):
    logging.info("read failed")
    pass
    # time.sleep(0.01) # wait 0.01s
    except Exception as e:
    pass
    #####################################################################################


    The issue is particularly perplexing as open() is a standard Python function. To gain more insight, I used gdb to debug the issue and obtained the following backtrace:

    Thread 86 "python3.8" received signal SIGSEGV, Segmentation fault.



    [Switching to Thread 0x7fff2a000640 (LWP 8129)]



    PyType_IsSubtype (b=0x5555558b1680 <PyBufferedReader_Type>, a=0x5555558b1616 <PyBufferedWriter_Type+310>) at Objects/typeobject.c:1369



    1369 Objects/typeobject.c: No such file or directory.



    (gdb) bt



    #0 PyType_IsSubtype (b=0x5555558b1680 <PyBufferedReader_Type>, a=0x5555558b1616 <PyBufferedWriter_Type+310>) at Objects/typeobject.c:1369



    #1 type_call (type=0x5555558b1680 <PyBufferedReader_Type>, args=0x7fffa8d43900, kwds=0x0) at Objects/typeobject.c:989



    #2 0x00005555555c9dfd in _PyObject_MakeTpCall (callable=0x5555558b1680 <PyBufferedReader_Type>, args=<optimized out>, nargs=<optimized out>, keywords=0x0) at Objects/call.c:159



    #3 0x00005555555ca31a in _PyObject_Vectorcall (kwnames=0x0, nargsf=<optimized out>, args=0x7fff29ffd060, callable=0x5555558b1680 <PyBufferedReader_Type>) at ./Include/cpython/abstract.h:125



    #4 _PyObject_Vectorcall (kwnames=0x0, nargsf=<optimized out>, args=0x7fff29ffd060, callable=0x5555558b1680 <PyBufferedReader_Type>) at ./Include/cpython/abstract.h:115



    #5 _PyObject_FastCall (nargs=<optimized out>, args=0x7fff29ffd060, func=0x5555558b1680 <PyBufferedReader_Type>) at ./Include/cpython/abstract.h:147



    #6 _PyObject_CallFunctionVa (callable=0x5555558b1680 <PyBufferedReader_Type>, format=format@entry=0x5555557df707 "Oi", va=va@entry=0x7fff29ffd0d0, is_size_t=is_size_t@entry=1) at Objects/call.c:941



    #7 0x00005555555cb156 in _PyObject_CallFunctionVa (is_size_t=1, va=0x7fff29ffd0d0, format=0x5555557df707 "Oi", callable=<optimized out>) at Objects/call.c:914



    #8 _PyObject_CallFunction_SizeT (callable=<optimized out>, format=format@entry=0x5555557df707 "Oi") at Objects/call.c:992



    #9 0x0000555555725a76 in _io_open_impl (module=<optimized out>, opener=0x555555898a80 <_Py_NoneStruct>, closefd=1, newline=0x0, errors=0x0, encoding=0x0, buffering=4096, mode=0x7ffff7b862e0 "r", file=<optimized out>)



    at ./Modules/_io/_iomodule.c:463



    #10 _io_open (module=<optimized out>, args=<optimized out>, nargs=<optimized out>, kwnames=<optimized out>) at ./Modules/_io/clinic/_iomodule.c.h:279



    #11 0x000055555560156f in cfunction_vectorcall_FASTCALL_KEYWORDS (func=0x7ffff7bcf680, args=0x7ffec002e228, nargsf=<optimized out>, kwnames=<optimized out>) at Objects/methodobject.c:441



    #12 0x00005555555b31fe in _PyObject_Vectorcall (kwnames=<optimized out>, nargsf=<optimized out>, args=<optimized out>, callable=<optimized out>) at ./Include/cpython/abstract.h:127



    #13 call_function (tstate=tstate@entry=0x7ffec40022a0, pp_stack=pp_stack@entry=0x7fff29ffd3c8, oparg=<optimized out>, kwnames=kwnames@entry=0x0) at Python/ceval.c:4963



    #14 0x00005555555b5ea0 in _PyEval_EvalFrameDefault (f=<optimized out>, throwflag=<optimized out>) at Python/ceval.c:3500



    #15 0x00005555556785b3 in PyEval_EvalFrameEx (throwflag=0, f=0x7ffec002dff0) at Python/ceval.c:741



    #16 _PyEval_EvalCodeWithName (_co=<optimized out>, globals=globals@entry=0x7ffff5d64280, locals=locals@entry=0x0, args=args@entry=0x7fffab6da990, argcount=1, kwnames=0x7fffa8de5e58, kwargs=0x7fffab6da998, kwcount=8, kwstep=1, defs=0x0,



    defcount=0, kwdefs=0x0, closure=0x0, name=0x7fffdf535db0, qualname=0x7fffe4906300) at Python/ceval.c:4298



    #17 0x00005555555ca7d3 in _PyFunction_Vectorcall (func=func@entry=0x7fffdff9b670, stack=stack@entry=0x7fffab6da990, nargsf=nargsf@entry=1, kwnames=kwnames@entry=0x7fffa8de5e40) at Objects/call.c:436



    #18 0x00005555555cc27d in PyVectorcall_Call (callable=0x7fffdff9b670, tuple=<optimized out>, kwargs=<optimized out>) at Objects/call.c:200



    #19 0x00005555555b6d62 in do_call_core (kwdict=0x7fffa8d52b80, callargs=0x7fffa8d6f700, func=0x7fffdff9b670, tstate=0x7ffec40022a0) at Python/ceval.c:5010



    #20 _PyEval_EvalFrameDefault (f=<optimized out>, throwflag=<optimized out>) at Python/ceval.c:3559



    #21 0x00005555556785b3 in PyEval_EvalFrameEx (throwflag=0, f=0x7ffec000fbb0) at Python/ceval.c:741



    #22 _PyEval_EvalCodeWithName (_co=<optimized out>, globals=globals@entry=0x7ffff5d64280, locals=locals@entry=0x0, args=<optimized out>, argcount=1, kwnames=0x7fffe48ffc28, kwargs=0x7ffec002df88, kwcount=8, kwstep=1, defs=0x0,



    defcount=0, kwdefs=0x0, closure=0x7fffe4900700, name=0x7ffff7a9f330, qualname=0x7fffe49619e0) at Python/ceval.c:4298



    #23 0x00005555555ca7d3 in _PyFunction_Vectorcall (func=<optimized out>, stack=<optimized out>, nargsf=<optimized out>, kwnames=<optimized out>) at Objects/call.c:436



    #24 0x000055555575b9ca in _PyObject_Vectorcall (kwnames=0x7fffe48ffc10, nargsf=1, args=0x7ffec002df80, callable=0x7fffdff9b700) at ./Include/cpython/abstract.h:127



    #25 method_vectorcall (method=<optimized out>, args=0x7ffec002df88, nargsf=<optimized out>, kwnames=0x7fffe48ffc10) at Objects/classobject.c:60



    #26 0x00005555555b31fe in _PyObject_Vectorcall (kwnames=<optimized out>, nargsf=<optimized out>, args=<optimized out>, callable=<optimized out>) at ./Include/cpython/abstract.h:127



    #27 call_function (tstate=tstate@entry=0x7ffec40022a0, pp_stack=pp_stack@entry=0x7fff29ffda10, oparg=<optimized out>, kwnames=kwnames@entry=0x7fffe48ffc10) at Python/ceval.c:4963



    #28 0x00005555555b6e22 in _PyEval_EvalFrameDefault (f=<optimized out>, throwflag=<optimized out>) at Python/ceval.c:3515



    #29 0x00005555556785b3 in PyEval_EvalFrameEx (throwflag=0, f=0x7ffec002dd90) at Python/ceval.c:741



    #30 _PyEval_EvalCodeWithName (_co=<optimized out>, globals=globals@entry=0x7ffff5d64280, locals=locals@entry=0x0, args=args@entry=0x7fffef1f6cf0, argcount=1, kwnames=0x7fffa8de6538, kwargs=0x7fffef1f6cf8, kwcount=6, kwstep=1,



    defs=0x7fffe491b218, defcount=2, kwdefs=0x0, closure=0x0, name=0x7fffdf5378b0, qualname=0x7fffe4906350) at Python/ceval.c:4298



    #31 0x00005555555ca7d3 in _PyFunction_Vectorcall (func=func@entry=0x7fffdff9b790, stack=stack@entry=0x7fffef1f6cf0, nargsf=nargsf@entry=1, kwnames=kwnames@entry=0x7fffa8de6520) at Objects/call.c:436



    #32 0x00005555555cc27d in PyVectorcall_Call (callable=0x7fffdff9b790, tuple=<optimized out>, kwargs=<optimized out>) at Objects/call.c:200



    #33 0x00005555555b6d62 in do_call_core (kwdict=0x7fffa8d59c00, callargs=0x7fffa8d8f460, func=0x7fffdff9b790, tstate=0x7ffec40022a0) at Python/ceval.c:5010



    #34 _PyEval_EvalFrameDefault (f=<optimized out>, throwflag=<optimized out>) at Python/ceval.c:3559



    #35 0x00005555556785b3 in PyEval_EvalFrameEx (throwflag=0, f=0x7fffa8dbb9f0) at Python/ceval.c:741



    #36 _PyEval_EvalCodeWithName (_co=<optimized out>, globals=globals@entry=0x7ffff5d64280, locals=locals@entry=0x0, args=<optimized out>, argcount=1, kwnames=0x7fffe490de38, kwargs=0x7ffec0011b88, kwcount=6, kwstep=1, defs=0x0,



    defcount=0, kwdefs=0x0, closure=0x7fffe49007f0, name=0x7ffff7a9f330, qualname=0x7fffe49604b0) at Python/ceval.c:4298



    #37 0x00005555555ca7d3 in _PyFunction_Vectorcall (func=<optimized out>, stack=<optimized out>, nargsf=<optimized out>, kwnames=<optimized out>) at Objects/call.c:436



    #38 0x000055555575b9ca in _PyObject_Vectorcall (kwnames=0x7fffe490de20, nargsf=1, args=0x7ffec0011b80, callable=0x7fffdff9b820) at ./Include/cpython/abstract.h:127



    #39 method_vectorcall (method=<optimized out>, args=0x7ffec0011b88, nargsf=<optimized out>, kwnames=0x7fffe490de20) at Objects/classobject.c:60



    #40 0x00005555555b31fe in _PyObject_Vectorcall (kwnames=<optimized out>, nargsf=<optimized out>, args=<optimized out>, callable=<optimized out>) at ./Include/cpython/abstract.h:127



    #41 call_function (tstate=tstate@entry=0x7ffec40022a0, pp_stack=pp_stack@entry=0x7fff29ffe050, oparg=<optimized out>, kwnames=kwnames@entry=0x7fffe490de20) at Python/ceval.c:4963



    #42 0x00005555555b6e22 in _PyEval_EvalFrameDefault (f=<optimized out>, throwflag=<optimized out>) at Python/ceval.c:3515



    #43 0x00005555556785b3 in PyEval_EvalFrameEx (throwflag=0, f=0x7ffec0011930) at Python/ceval.c:741



    #44 _PyEval_EvalCodeWithName (_co=<optimized out>, globals=globals@entry=0x7ffff5d64280, locals=locals@entry=0x0, args=args@entry=0x7fffa8d85b10, argcount=1, kwnames=0x7fffa8dd4828, kwargs=0x7fffa8d85b18, kwcount=5, kwstep=1, defs=0x0,



    defcount=0, kwdefs=0x0, closure=0x0, name=0x7fffdf53d1c0, qualname=0x7fffe490de70) at Python/ceval.c:4298



    #45 0x00005555555ca7d3 in _PyFunction_Vectorcall (func=func@entry=0x7fffdff9be50, stack=stack@entry=0x7fffa8d85b10, nargsf=nargsf@entry=1, kwnames=kwnames@entry=0x7fffa8dd4810) at Objects/call.c:436



    #46 0x00005555555cc27d in PyVectorcall_Call (callable=0x7fffdff9be50, tuple=<optimized out>, kwargs=<optimized out>) at Objects/call.c:200



    #47 0x00005555555b6d62 in do_call_core (kwdict=0x7fffa8d74540, callargs=0x7fffa8d85430, func=0x7fffdff9be50, tstate=0x7ffec40022a0) at Python/ceval.c:5010



    #48 _PyEval_EvalFrameDefault (f=<optimized out>, throwflag=<optimized out>) at Python/ceval.c:3559


    The backtrace suggests a type mismatch between PyBufferedReader_Type and PyBufferedWriter_Type, potentially indicating an issue at the CPython level.

    My analysis leads me to believe this might be a low-level CPython issue. but now I still don't know how to fix it.

    Is there a known effective solution to this problem? Should I consider upgrading or downgrading my Python environment (currently Python 3.8)? Are there any workarounds or alternative approaches to reading the JSON file that could mitigate this issue?

    Continue reading...

Compartilhe esta Página