如何捕获未对齐的内存访问?

lve*_*lla 16 c linux arm memory-alignment

我正在开发一个宠物开源项目,它实现了一些流密码算法,我遇到的问题只有在我在ARM处理器上运行时才会触发.我甚至尝试在qemu下运行x86中的ARM二进制文件,但是那里没有触发bug.

这个bug的具体机制仍然是难以捉摸的,但我最好的办法是相信它是由我的程序中未对齐的内存访问尝试引起的,这是由qemu实现的,但是我的开发板中真正的ARM处理器默默地忽略了它.

因此,由于问题显示非常难以诊断,我想知道是否有任何工具可用于捕获我运行的程序所做的未对齐内存访问,以便我可以确切地看到问题发生的位置.

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

Nic*_*rth 15

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
Run Code Online (Sandbox Code Playgroud)

  • 我相信这个答案会更好,因为它列出了我可以在 Linux 内核中设置的所有可能的行为来处理这个问题。就我而言,由于我正在调试程序,因此我使用了“4 - 向进程发送 SIGBUS”,GDB 向我提供了导致问题的精确线路。 (3认同)
  • 对不起,我们是一个竞争条件.如果你想从我的答案中获取信息,我会将其删除. (2认同)

art*_*ise 12

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

$ cat /proc/cpu/alignment 
User:           0
System:         0
Skipped:        0
Half:           0
Word:           0
DWord:          0
Multi:          0
User faults:    0 (ignored)
Run Code Online (Sandbox Code Playgroud)

它只对procfs有效,但很难想象没有procfs的系统.处理它的具体代码在alignment.c中.您可以使用echo 3 > /proc/cpu/alignmentLinux fixup指令并提供一些dmesg输出.通常,通过仿真处理未对齐的访问非常低效.最好纠正代码.附加调试器的信号选项应该提供一些关于异常源的线索.

阅读手册.;-)