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

时间:2010-07-14 13:15:02

标签: c++ unix gcc gdb core

我们在HPUX上,我的代码是用C ++编写的。 我们正在

  

BUS_ADRALN - 地址对齐无效

在函数调用的可执行文件中。这个错误意味着什么? 相同的功能工作很多次然后突然给它核心转储。 在GDB中,当我尝试打印对象值时,它表示不在上下文中。 任何线索在哪里检查?

4 个答案:

答案 0 :(得分:10)

您遇到了数据对齐问题。这可能是由于尝试读取或写入某种错误的指针而造成的。

数据对齐问题是当指针指向的地址未正确“对齐”时。例如,某些体系结构(例如旧的Cray 2)要求从内存中读取除单个字符以外的任何内容的任何尝试仅通过指针进行,其中指针的值的最后3位为0.如果任何最后一个3位为1,硬件将产生对齐故障,这将导致您遇到的问题。

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

对齐问题通常是由导致SEGFAULT或分段错误的同类问题引起的。通常是未初始化的指针。但它可能是由于错误的内存分配器没有返回正确对齐的指针,或者是指针在算法指针不正确时的结果而引起的。

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

作为旁注,x86和x86_64体系结构没有任何对齐要求。但是,由于高速缓存行的工作原理,以及各种其他原因,性能通常是一个好主意,使数据在与存储的数据类型一样大的边界上对齐(即32位int的4字节边界)。

答案 1 :(得分:3)

大多数处理器(不是x86和朋友......家庭lol的blacksheep)要求访问某些元素以在字节的倍数上对齐。即如果从地址0x04读取一个可以正常的整数,但是如果你尝试从0x03做同样的操作,你将导致中断被抛出。

这是因为如果它总是处于您正在使用的数据大小的倍数上,则更容易实现加载/存储硬件。

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

答案 2 :(得分:1)

实际上,HP-UX在ITRC上有自己的优秀论坛,一些惠普员工非常乐于助人。我刚刚看了你要问的同一主题here are some results。例如,the similar problem实际上是由错误的输入参数引起的。我强烈建议您先阅读类似问题的答案,并在必要时在那里发布您的问题。

顺便提一下,您可能会被要求发布这些gdb命令的结果:

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

答案 3 :(得分:1)

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

例如,gnustl和stlport都提供了C ++标准库的不同实现。如果你编译和链接gnustl,当你的一个依赖项被编译并链接到stlport时,你将各自拥有标准函数和类的不同实现。启动程序时,动态链接器将尝试解析所有导出的符号,并在不正确的偏移处发现已知符号,从而产生BUS_ADRALN信号。