c++ - 如何捕获 x86 上的数据对齐错误(Sparc 上的 SIGBUS)

标签 c++ c gcc g++

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

在这种情况下,在 Solaris-Sparc 上我收到了 SIGBUS,但在 i386 上一切正常。

环境:

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

编辑: 这就是我问这个的原因:

  • 我们的应用程序在使用 SIGBUS 的 Sol-Sparc 上崩溃。出于调试的目的,我会尝试在我们的 i386 平台上获得类似的行为。
  • 我们的 Sol-sparc 机器非常慢,因此在那里编译和调试需要很长时间。而且我们的 i386 机器速度惊人(8 核,32G 内存)。
  • 即使在 i386 平台上,也存在数据对齐错误的性能成本。因此,我希望尽可能修复数据对齐错误。

最佳答案

同时,我发现了一篇针对此主题的 Intel CPU 文档。

Intel® 64 and IA-32 Architectures Software Developer’s Manual .

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

编辑(来自上述文档的一些浓缩 Material ):

第 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).

另外 - 在 14.8.2.6 中 - 内存 Controller 错误 被提及。我不知道它是否只是换句话说:

table 14-11, Encoding of MMM and CCCC Sub-Fields
Address/Command Error  AC  011

关于c++ - 如何捕获 x86 上的数据对齐错误(Sparc 上的 SIGBUS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1929588/

相关文章:

c++ - 如何传递 RGBQUAD 作为参数?

c++ - isspace() 仅适用于最多 8 位数字?

c - 哈希表实现

c - 可变长度数组和段错误

c - 为什么我们在编译期间需要共享库

c++ - 在主函数中重命名 argc 和 argv 是否安全?

c++ - 在定义(.cpp 文件)中初始化 static float constexpr 成员是否可能

c - 使用 execve() 执行反向 shell

c++ - lambda 中的 for 循环问题

linux - 如何在 Cygwin 上安装 GCC 交叉编译器 (ix86)