2010-11-18 7 views
0

Je reçois une erreur de segmentation en accédant à un objet qui semble valide et entièrement accessible dans gdb. La segmentation ne concerne-t-elle pas toujours la mémoire inaccessible?Erreur de segmentation sur la mémoire valide

EDIT: plus de détails.

Le plantage s'est produit sous gdb afin que je puisse examiner la mémoire de l'objet. Les membres étaient réglés sur des valeurs correctes, il n'y avait donc aucune chance que j'accède à la mémoire en lecture seule. L'instruction où s'est écrasé s'est produite est une sorte de Var = Obj.GetMember() où Var, GetMember et le membre correspondant sont des entiers courts. Désalignement? Je suppose que cela provoquerait une erreur de bus, pas de segmentation. Je vais essayer de tout reconstruire. Le problème est que ce morceau de code s'exécute des milliers de fois par seconde et la segmentation se produit une fois en plusieurs jours.

+2

Pouvez-vous ajouter du code? – Kos

+0

Plus de détails s'il vous plaît. –

+0

Essayez valgrind pour vérifier la corruption de la mémoire. –

Répondre

2

Essayez de reconstruire complètement (rendre propre & & make), cela m'a aidé plusieurs fois quand j'ai rencontré des erreurs aussi bizarres.

fin UPD:

Si cela ne résout le problème, cela signifie généralement que quelque chose ne va pas avec votre makefile, généralement dépendances-up entre vissés .cpp et .h, par exemple: a.cpp comprend bh , mais bh n'est pas listé dans les dépendances d'a.cpp.

+0

J'ai posé une question à ce sujet il y a quelques semaines. http://stackoverflow.com/questions/3997404/initialization-of-member-bug-in-gcc-or-my-thinking –

0

Fondamentalement, oui. Avez-vous utilisé le core dump pour analyser votre erreur de segmentation?

0

Le code serait très utile, mais avez-vous fait un make clean? Si vous avez augmenté la taille d'une classe et que vos dépendances ne sont pas correctes, il n'y aura pas assez d'espace alloué pour une instance et cette classe dépassera et corrigera tout ce qu'elle précède dans la mémoire.

2

Vous pouvez obtenir des défauts, même si l'accès aux « valides » mémoire dans certaines circonstances:

  • que vous essayez de modifier la mémoire, mais la cartographie spécifique est en lecture seule
  • vous essayez d'exécuter du code dans un zone de mémoire qui est non-exécuter
  • vous tentez de par exemple chargement/stockage à une adresse désaligné et vos problèmes matériels exceptions d'alignement

Sans un regard sur le coredump, pour savoir ce que l'instruction la formation de failles (chargement/stockage/exécuter) était et ce exactement les autorisations de mappage pour l'accès la mémoire était impossible à distinguer.

Questions connexes