web-dev-qa-db-fra.com

Segfaults dans malloc () et malloc_consolidate ()

Mon application se sépare parfois et principalement dans malloc () et malloc_consolidate () quand je regarde la trace dans gdb.

J'ai vérifié que la machine a suffisamment de mémoire disponible, elle n'a même pas commencé à échanger. J'ai vérifié ulimits pour la séparation des données et la taille maximale de la mémoire et les deux sont définis sur "illimité". J'ai également exécuté l'application sous valgrind et je n'ai trouvé aucune erreur de mémoire.

Maintenant, je ne sais plus quoi d'autre pourrait causer ces erreurs de segmentation. Des idées ?

Mettre à jour: Puisque je ne trouve rien avec valgrind (ou ptrcheck), se pourrait-il qu'une autre application supprime la structure de la mémoire de libc ou existe-t-il une structure distincte pour chaque processus?

29
Gene Vincent

De http://www.gnu.org/s/libc/manual/html_node/Heap-Consistency-Checking.html#Heap-Consistency-Checking :

Une autre possibilité de vérifier et de se prémunir contre les bogues dans l'utilisation de malloc, realloc et free est de définir la variable d'environnement MALLOC_CHECK_. Lorsque MALLOC_CHECK_ est défini, une implémentation spéciale (moins efficace) est utilisée qui est conçue pour être tolérante contre les erreurs simples, telles que les doubles appels gratuits avec le même argument, ou les dépassements d'un seul octet (bogues ponctuels). Cependant, toutes ces erreurs ne peuvent pas être protégées et des fuites de mémoire peuvent en résulter. Si MALLOC_CHECK_ est défini sur 0, toute corruption de tas détectée est silencieusement ignorée; s'il est réglé sur 1, un diagnostic est imprimé sur stderr; s'il est défini sur 2, abandon est appelé immédiatement. Cela peut être utile car sinon un crash peut se produire beaucoup plus tard, et la véritable cause du problème est alors très difficile à trouver.

24
BillTorpey

Très probablement, vous jetez le tas - c'est-à-dire que vous écrivez au-delà des limites d'un morceau de mémoire que vous avez alloué, et cela écrase les structures de données que malloc() utilise pour gérer le tas. Cela provoque malloc() pour accéder à une adresse non valide et votre application se bloque.

Le manque de mémoire ne provoquerait pas le crash de malloc() - il retournerait simplement NULL. Cela pourrait entraîner le blocage de votre code si vous ne recherchez pas NULL, mais le site du crash ne serait pas dans malloc().

Il est un peu étrange que Valgrind ne signale aucune erreur - mais il y a des erreurs que l'outil "Memcheck" par défaut peut manquer. Essayez plutôt d'exécuter Valgrid avec outil "Ptrcheck" .

13
Martin B