解决办法:C向Python传递字串数组导致进程崩溃

  吾系统天天运行测试。有时就会发现,系统崩溃了。从CORE来看,是C调用Python崩溃了。说是参数问题,实际上反复检查代码都觉得正确。一般情况如下:

#47 0x00007f47432d82b3 in PyObject_Call ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#48 0x00007f47433ae547 in PyEval_CallObjectWithKeywords ()
   from /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
#49 0x00007f4746ae7342 in PythonClass::python_function (this=0x7f46900008c0,

  这个也不是必然崩溃,有机率,而且有时会频繁出现,有时很久没出现(这个要看越界的内存情况)。吾于是设计了个一个跟踪办法:

  1、将Python调用独立为进程。这样崩溃了,主进程还活着.

  2、通过共享内存传递数据。其实这个是有点麻烦,一个是速度问题,还有一个是死锁问题.总比大家一起崩溃强.

  3、调用Python之前保存参数,执行成功就清除。

  4、定时检查进程是否活着。发现Python已死,重启时输出执行前的参数。

  然后发现了一个有趣的情况:向Python传递整个画面,没问题;出错的都是传递部分画面。二者差异在哪里?吾分析后得出的结论是:

  传递整个画面,吾缓冲区大了1/4;而传递部分画面,缓冲区刚刚好。

  Python在处理参数时,会悄悄越界处理。于是,全画面不出错,部分画面出错。

  怎么办?吾直接把部分画面的缓冲区大小扩大一倍,传递时的画面大小参数依然为原来的。初步看运行情况良好。

猜你喜欢

转载自blog.csdn.net/quantum7/article/details/88732251