Comment détecter une erreur de segmentation détails de l'utilisation de Valgrind?
J'ai un std::map< std::string, std::string> qui initialisé avec certains appels de l'API. Quand je suis en train d'utiliser cette carte, je suis faute de segmentation. Comment puis-je détecter code non valide ou ce qui est invalide ou n'importe quel détail qui peut m'aider à résoudre le problème? Code ressemble à ceci:
std::map< std::string, std::string> cont;
some_func( cont ); //getting parameter by reference and initialize it, someone corrupted memory (cont) inside this function
std::cout << cont[ "some_key" ] << '\n'; //segmentation fault here, cannot access "some_key"
cont
ne se produira pas, à l'échelle mondiale qui vous accéder à certains objets globaux constructeur serait-il?BTW, voulez-vous accepter une réponse à chaque instant, ou alors. Laisser tout le monde sais qui réponse résolu votre problème est un aspect important de la communauté.
ok je vais écrire au sujet de fix
OriginalL'auteur Davit Siradeghyan | 2010-04-21
Vous devez vous connecter pour publier un commentaire.
En général, je ne suis pas sûr de savoir comment cette ligne pourrait être la génération d'un seg fault: le support de l'opérateur retournera toujours un std::string (création d'un vide si nécessaire) et il doit toujours être valide pour l'impression.
Est-il possible qu'au lieu de cela, la pile d'appel que vous voyez est pointant vers la ligne suivante à exécuter et il est en train de mourir dans some_func? Nous ne voyons pas le code, donc je ne peux pas dire si elle pourrait être à l'origine du problème.
En alternance est
some_func
à l'aide de char* (invoque temp std::string) pour initialiser les chaînes à la carte? Il est possible que cela pourrait être l'introduction d'une chaîne non valide dans la carte qui "arrive à travailler" pendant un moment, mais quand some_func retourne, il n'interagit pas avec l'impression de bien.OriginalL'auteur Mark B
vous lancez votre application (compilé en mode debug) avec la syntaxe suivante:
Valgrind va vous montrer la stack trace de l'endroit où la faute de segmentation s'est produite. Après c'est à vous de trouver ce qui s'est passé et de le corriger.
Dans votre code, indépendamment de valgrind, je voudrais vérifier ce qui revient
cont[ "some_key" ]
la cause la plus probable de votre erreur, c'est que la valeur retournée est quelques sauvages pointeur ou non initialisé à tous. Si donc toute tentative d'accès commecont["some_key"][0]
également provoquer une erreur de segmentation.Une autre idée: que penser de la chaîne de clés de votre carte ? Est-il possible que certains d'entre eux en silence (sans exception) n'a pas pu allouer de la partie données de la chaîne utilisée en tant que clé. La std::map n'est pas une table de hachage, mais seulement certains commandé conteneur. Lors de la recherche d'une clé, il peut avoir besoin d'accéder à d'autres touches et de la merde qui peut arriver. Pour vérifier que vous pouvez essayer pour itérer sur toutes les clés de votre carte et d'afficher le contenu (pour voir si le problème se produit en particulier avec "some_key" ou si vous pouvez accéder à rien dans la carte.
Vous pouvez également essayer avec un unordered_map si votre programme n'a pas besoin de passer commande pour voir si le comportement est le même.
OriginalL'auteur kriss
En plus de valgrind, vous pouvez essayer d'utiliser un débogueur afin de se concentrer sur votre problème.
Définir un point d'arrêt dans
some_func(cont)
ligne, et d'examiner sicont
est une référence valide.De plus, avez-vous pensé à ce
cont["some_key"]
est de retour si some_key pas présent?OriginalL'auteur Tom