如何捕获未alignment的内存访问?

我正在开发一个实现了一些stream密码algorithm的宠物开源项目,而且我在遇到只有在ARM处理器上运行它时才会触发的错误。 我甚至尝试在qemu下的x86下运行ARM二进制文件,但是在那里没有触发该错误。

错误的具体机制仍然是难以捉摸的,但我的最好的解决办法是相信这是由我的程序中的未alignment的内存访问尝试造成的,这是由qemu实现的,但被我的开发板中的真实ARM处理器默默无视。

所以,由于问题显示为非常难诊断,所以我想知道是否有任何工具可以用来捕获我的正在运行的程序所产生的未alignment的内存访问,以便我可以确切地看到问题发生的位置。

如果进程违反内存alignment限制,我也可以使用某种方式在我的ARM开发板上启用一些信号(SIGBUS,也许?),就像我们在访问未映射的内存地址时获得SIGSEGV一样。 它运行的是Linux 2.6.32。

Solutions Collecting From Web of "如何捕获未alignment的内存访问?"

Linux可以为你做修补程序或警告访问。

您可以启用/ proc / cpu / alignment中的行为,请参阅http://www.mjmwired.net/kernel/Documentation/arm/mem_alignment了解不同值的说明。

0 - Do nothing (default behavior) 1 - Warning in kernel-log with PC and Memory-Address printed. 2 - Fixup error 3 - Warn and Fixup 4 - Send a SIGBUS to the process 5 - Send SIGBUS and output Warning 

ARM Linux维护一个对齐处理程序异常的列表,

 $ cat /proc/cpu/alignment User: 0 System: 0 Skipped: 0 Half: 0 Word: 0 DWord: 0 Multi: 0 User faults: 0 (ignored) 

它只对procfs有效,但很难想象没有procfs的系统。 处理这个的具体代码在alignment.c中 。 你可以使用echo 3 > /proc/cpu/alignment让Linux 修正指令并提供一些dmesg输出。 通常,通过仿真来处理未对齐的访问是非常有效的。 更正代码更好。 带有调试器的信号选项应该提供有关异常源的一些线索。

阅读手册 。 😉