我们使用的是 HPUX,我的代码是 C++ 的。
我们正在得到
BUS_ADRALN - 无效地址对齐
在函数调用的可执行文件中。这个错误是什么意思?
相同的功能运行了很多次,然后突然出现核心转储。
在 GDB 中,当我尝试打印对象值时,它说不在上下文中。
有线索可以去哪里检查吗?
您遇到数据对齐问题。这可能是由于尝试通过某种错误的指针进行读取或写入而引起的。
数据对齐问题是指指针指向的地址未正确“对齐”。例如,某些体系结构(例如旧的 Cray 2)要求从内存中读取单个字符以外的任何内容的任何尝试只能通过指针进行,其中指针值的最后 3 位为 0。 3 位为 1,硬件将生成对齐错误,这将导致您所看到的问题。
大多数架构并没有那么严格,并且所需的对齐通常取决于所访问的确切类型。例如,32 位整数可能只需要指针的最后 2 位为 0,但 64 位浮点可能需要最后 3 位为 0。
对齐问题通常是由导致 SEGFAULT 或分段错误的同类问题引起的。通常是未初始化的指针。但这可能是由于错误的内存分配器未返回具有正确对齐方式的指针引起的,或者是由于指针类型不正确时对指针进行指针算术的结果引起的。
系统实施malloc
and/or operator new
几乎可以肯定是正确的,否则您的程序将比当前崩溃得多。所以我认为糟糕的内存分配器是最不可能吠叫的树。我会首先检查未初始化的指针,然后检查错误的指针算术。
附带说明一下,x86 和 x86_64 架构没有任何对齐要求。但是,由于缓存行的工作方式以及各种其他原因,将数据对齐到与所存储的数据类型一样大的边界(即 32 位 int 的 4 字节边界)通常是提高性能的好主意。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)