2010-07-14 5 views
4

Nous sommes sur HPUX et mon code est en C++. Nous obtenons "BUS_ADRALN - Alignement d'adresse invalide" dans notre exécutable lors d'un appel de fonction. Que signifie cette erreur? La même fonction fonctionne plusieurs fois puis soudainement elle donne le vidage du noyau. dans GDB lorsque j'essaie d'imprimer les valeurs de l'objet, il ne dit pas dans le contexte. La moindre idée où vérifier?que signifie "BUS_ADRALN - Invalid address alignment"?

Merci à l'avance.

Répondre

8

Vous rencontrez un problème d'alignement des données. Cela est probablement dû à la tentative de lecture ou d'écriture via un mauvais pointeur.

Un problème d'alignement des données se produit lorsque l'adresse pointée vers un pointeur n'est pas correctement alignée. Par exemple, certaines architectures (l'ancien Cray 2 par exemple) exigent que toute tentative de lecture de tout autre élément que la mémoire se fasse uniquement à travers un pointeur dans lequel les 3 derniers bits de la valeur du pointeur sont 0. Si l'un des 3 bits sont 1, le matériel va générer une erreur d'alignement qui entraînera le genre de problème que vous voyez.

La plupart des architectures ne sont pas si strictes, et souvent l'alignement requis dépend du type exact auquel on accède. Par exemple, un entier de 32 bits peut nécessiter que les 2 derniers bits du pointeur soient 0, mais un flottant de 64 bits peut exiger que les 3 derniers bits soient 0.

Les problèmes d'alignement sont généralement causés par les mêmes types de problèmes qui provoquent une erreur SEGFAULT ou de segmentation. Habituellement un pointeur qui n'est pas initialisé. Mais il peut être provoqué par un mauvais allocateur de mémoire qui ne retourne pas les pointeurs avec l'alignement correct, ou par le résultat de l'arithmétique de pointeur sur le pointeur quand il n'est pas du bon type.

L'implémentation système de malloc et/ou operator new est presque certainement correcte ou votre programme se bloque bien avant qu'il ne le soit actuellement. Donc, je pense que le mauvais allocateur de mémoire est l'arbre le moins susceptible d'aller aboyer. Je vérifierais d'abord pour un pointeur non initialisé et puis l'arithmétique de mauvais pointeur.

3

La plupart des processeurs (pas x86 et amis .. le blacksheep de la famille lol) nécessitent des accès à certains éléments pour être alignés sur des multiples d'octets. C'est à dire. Si vous lisez un nombre entier à partir de l'adresse 0x04, cela est correct, mais si vous essayez de faire la même chose à partir de 0x03, une interruption sera lancée. Ceci est dû au fait qu'il est plus facile d'implémenter le matériel de chargement/stockage s'il est toujours sur un multiple de la taille de données avec laquelle vous travaillez.

Étant donné que HP-UX s'exécute uniquement sur les processeurs RISC, qui ont généralement de telles contraintes, vous devriez voir ici ->http://en.wikipedia.org/wiki/Data_structure_alignment#RISC.

+0

Merci pour la réponse. Dans mon cas, ma fonction renvoie un caractère. il ne manque pas tous les temps . Je vais vérifier votre lien wiki. – Hemant

+0

@Hermant: Je ne vérifie pas la valeur de retour, qui est généralement passée dans un registre. Je verrais les arguments de la fonction. –

+0

ma fonction ne prend aucun argument. appel est comme si (abcd-> foo() == 'X') // faire quelque chose d'autre /sinon partie – Hemant

1

En fait, HP-UX a son propre forum sur ITRC et certains membres du personnel HP sont très utiles. J'ai juste jeté un coup d'oeil au même sujet que vous demandez et here are some results. Par exemple, the similar problem a été causé par un mauvais paramètre d'entrée. Je vous conseille vivement de lire les réponses à des questions similaires et, le cas échéant, d'y poser votre question.

Par ailleurs, il est probable que vous demandera d'afficher des résultats de ces gdb commandes:

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

merci je vais vérifier hp Forum. – Hemant

1

La plupart de ces problèmes sont causés par plusieurs dépendances en amont liées à différentes versions de la même bibliothèque.Par exemple, gnustl et stlport fournissent des implémentations distinctes de la bibliothèque standard C++. Par exemple, gnustl et stlport fournissent des implémentations distinctes de la bibliothèque standard C++. Si vous compilez et créez un lien avec gnustl, alors que l'une de vos dépendances a été compilée et liée à stlport, vous aurez une implémentation différente des fonctions et des classes standard. Lorsque votre programme est lancé, l'éditeur de liens dynamiques tentera de résoudre tous les symboles exportés et détectera les symboles connus à des décalages incorrects, ce qui donnera le signal BUS_ADRALN.