我正在开发一个宠物开源项目,它实现了一些流密码算法,我遇到的问题只有在我在ARM处理器上运行时才会触发 . 我甚至尝试在qemu下运行x86中的ARM二进制文件,但是那里没有触发bug .
这个bug的具体机制仍然是难以捉摸的,但我最好的办法是相信它是由我的程序中未对齐的内存访问尝试引起的,这是由qemu实现的,但是我的开发板中真正的ARM处理器默默地忽略了它 .
因此,由于问题显示非常难以诊断,我想知道是否有任何工具可用于捕获我运行的程序所做的未对齐内存访问,以便我可以确切地看到问题发生的位置 .
我还可以使用某种方式在我的ARM开发板上启用一些信号(SIGBUS,可能?),如果进程违反了内存对齐限制,就像我们在访问未映射的内存地址时得到SIGSEGV一样 . 它运行的是Linux 2.6.32 .
2 回答
Linux可以为您完成修复或警告访问 .
您可以在/ proc / cpu / alignment中启用行为,有关不同值的说明,请参阅http://www.mjmwired.net/kernel/Documentation/arm/mem_alignment .
ARM Linux维护一个对齐处理程序异常列表,
它只对procfs有效,但很难想象没有procfs的系统 . 处理此问题的具体代码在alignment.c中 . 您可以使用
echo 3 > /proc/cpu/alignment
让Linux修复该指令并提供一些dmesg
输出 . 通常,通过仿真处理未对齐的访问非常低效 . 最好纠正代码 . 附加调试器的信号选项应该提供一些关于异常源的线索 .阅读manual . ;-)