c++ unix gcc gdb core

c++ - ¿Qué significa el error "BUS_ADRALN-Invalid address alignment"?



unix gcc (4)

En realidad, HP-UX tiene su propio gran foro sobre ITRC y algunos miembros del personal de HP son muy útiles. Acabo de echar un vistazo al mismo tema que estás preguntando y aquí hay algunos resultados . Por ejemplo, el problema similar fue causado en realidad por un mal parámetro de entrada. Le aconsejo encarecidamente que primero lea las respuestas a una pregunta similar y, si es necesario, que publique su pregunta allí.

Por cierto, es probable que se le pida que publique resultados de estos comandos gdb :

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

Estamos en HPUX y mi código está en C ++. Estamos obteniendo "BUS_ADRALN - Alineación de dirección inválida" en nuestro ejecutable en una llamada de función. ¿Qué significa este error? La misma función está funcionando muchas veces y de repente está dando vuelco al núcleo. en GDB cuando intento imprimir los valores del objeto, dice que no están en contexto. ¿Alguna pista donde verificar?

Gracias por adelantado.


La mayoría de los procesadores (no x86 y amigos ... el blacksheep de la familia jajaja) requieren accesos a ciertos elementos para alinearse en múltiplos de bytes. Es decir, si lee un número entero desde la dirección 0x04, está bien, pero si intenta hacer lo mismo desde 0x03, provocará una interrupción.

Esto se debe a que es más fácil implementar el hardware de carga / almacenamiento si siempre está en un múltiplo del tamaño de datos con el que está trabajando.

Como HP-UX se ejecuta solo en procesadores RISC, que suelen tener tales limitaciones, debería ver aquí -> http://en.wikipedia.org/wiki/Data_structure_alignment#RISC .


Usted está teniendo un problema de alineación de datos. Esto es probablemente causado al tratar de leer o escribir a través de un puntero malo de algún tipo.

Un problema de alineación de datos es cuando la dirección a la que apunta un apuntador no está "alineada" correctamente. Por ejemplo, algunas arquitecturas (las antiguas Cray 2 por ejemplo) requieren que cualquier intento de leer cualquier cosa que no sea un solo carácter de la memoria solo ocurra a través de un puntero en el que los últimos 3 bits del valor del puntero son 0. Si alguna de las últimas 3 bits son 1, el hardware generará una falla de alineación que dará como resultado el tipo de problema que está viendo.

La mayoría de las arquitecturas no son tan estrictas, y con frecuencia la alineación requerida depende del tipo exacto al que se acceda. Por ejemplo, un entero de 32 bits puede requerir que los últimos 2 bits del puntero sean 0, pero un flotante de 64 bits podría requerir que los últimos 3 bits sean 0.

Los problemas de alineación suelen ser causados ​​por los mismos tipos de problemas que podrían causar un SEGFAULT o un error de segmentación. Por lo general, un puntero que no se inicializa. Pero podría deberse a un mal asignador de memoria que no devuelve los punteros con la alineación adecuada, o por el resultado de la aritmética del puntero en el puntero cuando no es del tipo correcto.

La implementación del sistema de malloc y / o operator new es casi seguro que su programa se estrellaría mucho antes de que lo haga. Así que creo que el mal asignador de memoria es el árbol menos propenso a ladrar. Verificaría primero un puntero no inicializado y luego una mala aritmética de puntero.


La mayoría de estos problemas son causados ​​por múltiples dependencias en sentido ascendente que enlazan a diferentes versiones de la misma biblioteca.

Por ejemplo, tanto gnustl como stlport proporcionan implementaciones distintas de la biblioteca estándar de C ++. Si compila y establece un enlace contra gnustl, mientras que una de sus dependencias se compiló y vinculó contra stlport, cada una de ellas tendrá una implementación diferente de las funciones y clases estándar. Cuando se inicia su programa, el enlazador dinámico intentará resolver todos los símbolos exportados y descubrirá símbolos conocidos en desplazamientos incorrectos, lo que dará como resultado la señal BUS_ADRALN.