什么是;总线“ADRALN-地址对齐无效”;错误意味着什么? 我们在HPUX上,我的代码是C++。 我们越来越

什么是;总线“ADRALN-地址对齐无效”;错误意味着什么? 我们在HPUX上,我的代码是C++。 我们越来越,c++,unix,gcc,gdb,core,C++,Unix,Gcc,Gdb,Core,总线ADRALN-地址对齐无效 在函数调用的可执行文件中。这个错误意味着什么? 同一个函数工作了很多次,然后突然给出了内核转储。 在GDB中,当我尝试打印对象值时,它会在上下文中显示not。 有什么线索可以查吗?大多数处理器(不是x86和friends..家族中的害群之马lol)都要求访问某些元素以字节倍数对齐。也就是说,如果您从地址0x04读取一个整数,这是可以的,但是如果您尝试从0x03读取相同的整数,则会导致抛出一个中断 这是因为,如果加载/存储硬件始终是您使用的数据大小的倍数,则更容易实

总线ADRALN-地址对齐无效

在函数调用的可执行文件中。这个错误意味着什么? 同一个函数工作了很多次,然后突然给出了内核转储。 在GDB中,当我尝试打印对象值时,它会在上下文中显示not。 有什么线索可以查吗?

大多数处理器(不是x86和friends..家族中的害群之马lol)都要求访问某些元素以字节倍数对齐。也就是说,如果您从地址0x04读取一个整数,这是可以的,但是如果您尝试从0x03读取相同的整数,则会导致抛出一个中断

这是因为,如果加载/存储硬件始终是您使用的数据大小的倍数,则更容易实现加载/存储硬件


由于HP-UX仅在RISC处理器上运行,而RISC处理器通常有这样的限制,您应该在这里看到->。

事实上,HP-UX在ITRC上有自己的论坛,一些HP员工非常乐于助人。我只是看了一下你问的同一个话题,然后。例如,实际上是由错误的输入参数引起的。我强烈建议你先阅读类似问题的答案,如果有必要,把你的问题贴在那里

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

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

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

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

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

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

malloc
和/或
operator new
的系统实现几乎肯定是正确的,否则您的程序将在当前崩溃之前崩溃。所以我认为坏内存分配器是最不可能出现问题的树。我会先检查未初始化的指针,然后检查错误的指针算法


另外,x86和x86_64体系结构没有任何对齐要求。但是,由于缓存线的工作方式以及其他各种原因,通常最好将数据对齐到与存储的数据类型一样大的边界上(即,对于32位int,4字节边界).

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


例如,GnUSTL和STLPART都提供了C++标准库的不同实现。如果您针对gnustl编译和链接,而您的一个依赖项是针对stlport编译和链接的,那么每个依赖项都有不同的标准函数和类的实现。启动程序时,动态链接器将尝试解析所有导出的符号,并将发现偏移量不正确的已知符号,从而产生总线ADRALN信号。

感谢您的响应。在我的例子中,我的函数返回一个char。并不是每次都失败。我会检查你的维基链接。@Hermant:我不会检查返回值,返回值通常在寄存器中传递。我将检查函数的参数。我的函数不接受任何参数。调用类似于(abcd->foo()='X')//执行其他操作//执行其他部分