Comment forcer l'abandon sur "glibc detected *** free (): pointeur invalide"
Dans un environnement Linux, lors de l'obtention de "glibc détecté *** free(): invalid pointer" les erreurs, comment puis-je identifier la ligne de code qui en est la cause?
Est-il un moyen de forcer un abandon? Je me souviens qu'il y ait un ENV var pour contrôler cela?
Comment définir un point d'arrêt dans gdb pour la glibc erreur?
source d'informationauteur mmccoo
Vous devez vous connecter pour publier un commentaire.
Je crois que si vous setenv
MALLOC_CHECK_
à 2, glibc appelleraabort()
lorsqu'il détecte le "free(): pointeur non valide" erreur. Note de fin du trait de soulignement dans le nom de la variable d'environnement.Si
MALLOC_CHECK_
est de 1 glibc imprimé "free(): pointeur non valide" (et des printfs pour les autres erreurs). SiMALLOC_CHECK_
est 0, glibc silencieusement ignorer ces erreurs et il suffit de le retourner. SiMALLOC_CHECK_
est de 3 glibc affiche le message et ensuite appelerabort()
. I. e. son masque.Vous pouvez également appeler
mallopt(M_CHECK_ACTION, arg)
avec un argument de 0 à 3, et obtenir le même résultat qu'avecMALLOC_CHECK_
.Puisque vous êtes en voyant le "free(): pointeur non valide" message je pense que vous devez déjà être en paramètre
MALLOC_CHECK_
ou en appelantmallopt()
. Par défaut, la glibc ne pas imprimer ces messages.Quant à la façon de déboguer, l'installation d'un gestionnaire pour
SIGABRT
est probablement la meilleure façon de procéder. Vous pouvez définir un point d'arrêt dans votre gestionnaire ou délibérément déclencher un core dump.Je vous recommande de prendre valgrind:
valgrind --tool=memcheck --leak-check=full ./un.hors
En général, il semble que vous pourriez avoir à recompiler la glibc, pouah.
Vous ne dites pas dans quel environnement vous utilisez, mais si vous pouvez recompiler votre code pour OS X, puis sa version de la libc a un free() qui est à l'écoute de cette variable d'environnement:
La page de man pour free() sur OS X dispose de plus d'informations.
Si vous êtes sur Linux, puis essayez Valgrindon peut trouver quelques-impossible-de-chasse aux bogues.
(gdb) b nom de fichier:linenumber
//exemple: b principal.rpc:100
J'étais sous l'impression qu'il abandonnée par défaut. Assurez-vous d'avoir la version de débogage installé.
Ou de l'utilisation libdmalloc5: "remplacer le système de
malloc',
realloc',calloc',
libre " et d'autres routines de gestion de mémoire, tout en fournissant de puissantes fonctions de débogageconfigurable lors de l'exécution. Ces installations comprennent des choses telles que la mémoire de la fuite de suivi, clôture post écrire détection, le fichier/numéro de ligne de reporting, et de journalisation général des statistiques."
L'ajouter à votre commande de liaison
gdb doit revenir automatiquement de contrôle lors de la glibc déclenche un abandon.
Ou vous pouvez configurer un gestionnaire de signal pour SIGABRT de dump de la stacktrace à un fd (descripteur de fichier). Ci-dessous, mp_logfile est un FICHIER*