如何确定 "BUS-Error" 的原因

How to determine the cause for "BUS-Error"

我正在研究具有 yocto 分布和 python 2.7.3 的 variscite 板。

我有时会收到来自 python 解释器的 总线错误 消息。
我的程序至少在错误发生前的几个小时或几天内正常运行。
但是当我获取一次的时候,我尝试重启我的程序的时候就直接获取了。
在系统再次运行之前,我必须重新启动。

我的程序只使用了一个串行端口、一点usb 通信和一些tcp 套接字。

我可以切换到另一个硬件并遇到同样的问题。

我还使用了 python 自测
python -c "from test import testall"

我得到了这两个测试的错误

test_getattr (test.test_builtin.BuiltinTest) ... ERROR test_nameprep (test.test_codecs.NameprepTest) ... ERROR

并且自检总是停在

test_callback_register_double (ctypes.test.test_callbacks.SampleCallbacksTestCase) ... Segmentation fault

但是当系统运行几个小时时,自检会提前停止在

ctypes.macholib.dyld Bus error

我用memtester检查了RAM,好像没问题。
我如何找到问题的原因?

总线错误通常是由应用程序试图访问硬件无法物理寻址的内存引起的。在您的情况下,存在分段错误,这可能会导致取消引用错误的指针或类似的东西,从而导致访问物理上不可寻址的内存地址。我首先从导致分段错误的根源开始,因为总线错误是次要症状。

一年后我找到了问题的间接原因。

我写了一个 crc16 模块,它使用了:

from ctypes import c_ushort
...
value = c_ushort(crcValue >>8 ) ...

在 BUS-Error 的情况下,这是有问题的部分。

我不认为 c_ushort() 函数本身导致了问题,它只是表明有问题的函数。

系统升级到Linux version 3.14.38-6QP+g8740b9f (test@Yocto) (gcc version 4.9.2 (GCC) )后问题消失