我正在寻找关于未对齐数据访问的 SIGBUS。我正在跟踪其中一个错误,我想知道这在 sitara am335x 上是如何发生的。有人可以给我一个示例代码来描述或确保触发它。
添加代码片段:
int Read( void *value, uint32_t *size, const uint32_t baseAddress )
{
uint8_t *userDataAddress = (uint8_t *)( baseAddress + sizeof( DBANode ));
memcpy( value, userDataAddress, ourDataSize );
*size = ourDataSize;
return 0;
}
DBA 节点是一个 20 字节的类对象。baseAddress 是一个映射到共享内存文件的另一个 DBANode 类对象类型的映射到一个 uint32_t 以便可以完成算术运算。
这是该部分的分解:
91a8: e51b3010 ldr r3, [fp, #-16]
91ac: e5933000 ldr r3, [r3]
91b0: e51b0014 ldr r0, [fp, #-20] ; 0xffffffec
91b4: e51b1008 ldr r1, [fp, #-8]
91b8: e1a02003 mov r2, r3
91bc: ebffe72b bl 2e70 <memcpy@plt>
91c0: e51b3010 ldr r3, [fp, #-16]
91c4: e5932000 ldr r2, [r3]
91c8: e51b3018 ldr r3, [fp, #-24] ; 0xffffffe8
91cc: e5832000 str r2, [r3]
00002e70 <memcpy@plt>:
2e70: e28fc600 add ip, pc, #0, 12
2e74: e28cca08 add ip, ip, #8, 20 ; 0x8000
2e78: e5bcf868 ldr pc, [ip, #2152]! ; 0x868
当重新构建完全相同的代码库时,问题就消失了。gcc 可以创建 2 个不同版本的指令,并为 gcc 指定相同的 -O0 优化吗?
我还对库进行了比较,因此文件 obj 在两个编译中都转储了。它们完全相同。该api经常被使用。但是,只有在长时间使用几天后才会发生崩溃。我每 500 毫秒读取一次同一个节点。所以这并不一致。我应该看看指针损坏吗?