“BUS_ADRALN - 无效地址对齐”错误的含义是什么?

问题描述:

我们在HPUX上,我的代码是用C++编写的。 我们在函数调用的可执行文件中得到了“BUS_ADRALN - 无效地址对齐”。 这个错误是什么意思? 同样的功能正在多次工作,然后突然给它核心转储。 在GDB中,当我尝试打印它说不在上下文中的对象值时。 任何线索在哪里检查?“BUS_ADRALN - 无效地址对齐”错误的含义是什么?

在此先感谢。

你有一个数据对齐问题。这可能是由于尝试通过某种类型的错误指针进行读取或写入而造成的。

数据对齐问题是当指针指向的地址未正确对齐时。例如,某些体系结构(例如旧的Cray 2)要求任何尝试从存储器中读取除单个字符之外的任何内容的操作都只能通过指针的最后3位为0的指针发生。如果有最后一个3位是1,硬件会产生对齐错误,这会导致您遇到的问题。

大多数体系结构都不是那么严格,而且所需的对齐取决于所访问的确切类型。例如,一个32位整数可能只需要指针的最后2位为0,但64位浮点数可能需要最后3位为0.

对齐问题通常是由相同类型的会导致SEGFAULT或分段故障的问题。通常是一个未初始化的指针。但是它可能是由不正确的内存分配器引起的,该内存分配器不会返回具有正确对齐方式的指针,也可能是指针的指针运算结果不正确。

malloc和/或operator new的系统实现几乎可以肯定是正确的,或者您的程序在它现在执行之前会崩溃。所以我认为糟糕的内存分配器是最不可能吠叫的树。我会首先检查一个未初始化的指针,然后是错误的指针算术。

大多数处理器(不是x86和朋友......这个家族的黑匣子)需要访问某些元素以在多个字节上对齐。即如果你从地址0x04读取一个整数就可以了,但是如果你试图从0x03做同样的操作,你将会引发一个中断。

这是因为如果加载/存储硬件始终位于您工作的多个数据大小上,则更容易实现加载/存储硬件。

由于HP-UX仅在通常具有此类约束的RISC处理器上运行,因此您应该在此处看到 - >http://en.wikipedia.org/wiki/Data_structure_alignment#RISC

+0

感谢您的回复。在我的情况下,我的函数返回一个字符。它不会每 时间失败。 我会检查你的维基链接。 – Hemant 2010-07-14 13:46:03

+0

@Hermant:我不会检查返回值,通常在寄存器中传递。我会检查函数的参数。 – 2010-07-14 13:56:17

+0

我的功能没有任何参数。电话就像 if(abcd-> foo()=='X') //做些什么 否则 //其他部分 – Hemant 2010-07-14 16:56:15

实际上HP-UX在ITRC上有自己的伟大论坛,而且一些惠普员工非常有帮助。我只是看了一下你正在问的同一个话题和here are some results。例如the similar problem实际上是由一个错误的输入参数引起的。我强烈建议您先阅读类似问题的答案,并在必要时将问题发布到那里。

通过很可能你会被要求发布这些gdb命令的结果的方式:

(gdb) bt 
(gdb) info reg 
(gdb) disas $pc-16*8 $pc+16*4 
+0

谢谢我会检查hp论坛。 – Hemant 2010-07-14 13:49:00

这些问题中的大多数是由多个上游依赖项链接到同一个库的不同版本引起的。

例如,gnustl和stlport都提供了C++标准库的不同实现。如果您编译并链接到gnustl,而您的一个依赖关系已经编译并链接到stlport,那么您将分别具有不同的标准函数和类的实现。启动程序时,动态链接程序将尝试解析所有导出的符号,并以不正确的偏移量发现已知符号,从而产生BUS_ADRALN信号。