吾系统天天运行测试。有时就会发现,系统崩溃了。从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在处理参数时,会悄悄越界处理。于是,全画面不出错,部分画面出错。
怎么办?吾直接把部分画面的缓冲区大小扩大一倍,传递时的画面大小参数依然为原来的。初步看运行情况良好。