admin管理员组

文章数量:1401369

I am encounting a segmentation fault 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 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:

# 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?

I am encounting a segmentation fault 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 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:

# 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?
Share Improve this question edited Mar 23 at 16:51 wjandrea 33.2k10 gold badges69 silver badges98 bronze badges asked Mar 23 at 13:06 CarlosCarlos 4171 gold badge5 silver badges21 bronze badges 3
  • The backtrace seems to implicate an interaction between the PyBufferedReader_Type and PyBufferedWriter_Type type objects, but I don't see any reason to conclude that the specific issue is a type mismatch. On the other hand, this definitely does appear to show a bug in CPython. As such, you probably want to look for a workaround instead of trying to fix the issue itself. Upgrading to a newer version of Python is the first workaround I would try. – John Bollinger Commented Mar 23 at 13:25
  • 3 Support for Python-3.8 ended in Oct 2024, so upgrading would seem essential. – ekhumoro Commented Mar 23 at 13:44
  • Treat this as a bug in Python. That means, first check if it happens after an update or whether such a bug was reported in the past already. Also, as with every issue, extracting a minimal reproducible example should be one of your first steps. – Ulrich Eckhardt Commented Mar 23 at 15:06
Add a comment  | 

1 Answer 1

Reset to default 0

"I attempted two solutions to resolve the issue.

First, I upgraded Python from 3.8 to 3.10. After the upgrade, the issue no longer occurred.

However, the upgrade introduced other version compatibility problems. Therefore, I tried a second approach:

I created a function to send requests and receive return information. This method bypasses the JSON write and read stage, effectively solving my problem."

from ddpg_model.get_mqtt_data import mqtt_receiver
from ddpg_model.send_mqtt import send_mqtt

def get_data(current_message_id,requests):
    mqtt_receiver.prepare_for_new_request(current_message_id)
    send_mqtt(requests)

    if mqtt_receiver.data_event.wait(timeout=120):
        return mqtt_receiver.latest_payload
    else:
        return None

本文标签: Segmentation Fault during open() of JSON file in Python 38Stack Overflow