如何在x86上捕获数据对齐错误(在Sparc上也称为SIGBUS)

15 c c++ gcc g++

是否有可能在i386上捕获数据对齐错误?也许通过设置i386特定的机器寄存器或类似的东西.

在Solaris-Sparc上我在这种情况下收到一个SIGBUS,但在i386上一切都很好.

环境:

  • 32位应用程序
  • Ubuntu Karmic
  • gcc/g ++ v4.4.1

编辑:这就是为什么我这样问:

  • 我们的应用程序在使用SIGBUS的Sol-Sparc上崩溃了.出于调试的目的,我会尝试在i386平台上获得类似的行为.
  • 我们的Sol-sparc机器非常慢,因此编译和调试需要很长时间.我们的i386机器速度令人难以置信(8核,32G内存).
  • 即使在i386平台上,数据对齐错误也会带来性能损失.因此,我想尽可能修复数据对齐错误.

小智 9

与此同时,我发现了一个处理该主题的英特尔CPU文

请参阅英特尔®64和IA-32架构软件开发人员手册.

似乎很难把所有这些东西放在一起.然而,这听起来并非完全不可能.有趣的章节是4.10.5检查对齐

编辑(来自上述文件的一些简明材料):

第5-60页

Interrupt 17 Alignment Check Exception (#AC)

to enable alignment checking, the following conditions must be true:

AM flag is set(bit 18 of control regisster CR0)
AC flag is set (bit 18 of the EFLAGS)
The CPL is 3 (protected mode or virtual-8086 mode).
Run Code Online (Sandbox Code Playgroud)

另外 - 在14.8.2.6中 - 提到了存储器控制器错误.换句话说,我不知道它是否相同:

table 14-11, Encoding of MMM and CCCC Sub-Fields
Address/Command Error  AC  011
Run Code Online (Sandbox Code Playgroud)


Ale*_*min 4

为了扩展 Vokuhila-Oliba 的答案,查看“ SOF Mis-aligned pointers on x86. ”线程,gcc 似乎可以生成具有未对齐内存访问的代码。AFAIK 你对此没有任何控制权。

对 gcc 编译的代码启用对齐检查将是一个坏主意。对于好的C 代码,您可能会遇到 SIGBUS 错误。

重新编辑:抱歉

  • 对于__在 SPARC__ 上工作的代码,您可能会面临使用 SIGBUS 的风险。似乎 x86 gcc 在变量初始化等地方进行了未对齐的访问,我不确定您是否可以更改该行为。 (3认同)