140 votes

Comment "fixer un point d'arrêt dans malloc_error_break pour déboguer" ?

J'obtiens beaucoup de sorties de console comme celle-ci sans que mon application ne se bloque :

malloc : * Erreur pour l'objet 0xc6a3970 : le pointeur libéré n'a pas été alloué. alloué * mettre un point d'arrêt dans malloc_error_break pour déboguer

Comment puis-je savoir quel objet ou quelle variable est affecté ?

J'ai essayé de mettre un point d'arrêt symbolique comme ceci mais il ne s'arrête jamais :

enter image description here

1 votes

Je résous ce problème en désactivant safari inspect. stackoverflow.com/a/43885754/6521116

0 votes

L'une des causes de ce problème est une fonction/méthode qui est censée renvoyer un objet et qui atteint la fin de la fonction et ne renvoie rien.

149voto

Andrew Madsen Points 12967

Définissez un point d'arrêt sur malloc_error_break() en ouvrant le navigateur de points d'arrêt (View->Navigators->Show Breakpoint Navigator ou ⌘8), en cliquant sur le bouton plus dans le coin inférieur gauche et en sélectionnant "Add Symbolic Breakpoint". Dans la fenêtre qui s'affiche, entrez malloc_error_break dans le champ Symbole, puis cliquez sur Terminé.

EDIT : openfrog a ajouté une capture d'écran et a indiqué qu'il a déjà essayé ces étapes sans succès. après J'ai posté ma réponse. Avec cette modification, je ne sais pas trop quoi dire. Je n'ai pas vu cela ne pas fonctionner moi-même, et en effet je garde toujours un point d'arrêt sur malloc_error_break set.

2 votes

Cela a fonctionné pour moi (sans le module). La cause du problème pour moi était que j'avais un module UIImage sauvegardée par un fichier, et j'ai écrasé le fichier avec une image différente. Cela a provoqué une erreur lorsque j'ai appelé UIImagePNGRepresentation sur l'image originale (pas lorsque le fichier a été effectivement écrasé).

1 votes

Je n'ai pas de bouton plus dans le coin inférieur gauche de l'écran. 7 bar... Peut-être que vous vouliez dire 8 ?

1 votes

@ScottyBlades je suppose que le raccourci a changé. J'ai écrit cette réponse il y a 8 ans et 7 versions majeures de Xcode...

48voto

Vinzzz Points 5702

Dans votre capture d'écran, vous n'avez pas spécifié de module : essayez de définir "libsystem_c.dylib".

enter image description here

J'ai fait ça, et ça marche : le point d'arrêt s'arrête ici (bien que la stacktrace provienne souvent d'une obscure librairie système...)

9 votes

On dirait que le nom du module est différent dans iOS, c'est : libsystem_malloc.dylib . Breakpoint fonctionne pour moi sans spécifier de module.

7voto

Sébastien Points 42

J'ai eu le même problème avec Xcode. J'ai suivi les étapes que vous avez données et cela n'a pas fonctionné. Je suis devenu fou parce que dans chaque forum que j'ai vu, tous les indices pour ce problème sont ceux que vous avez donnés. J'ai finalement vu que j'avais mis un espace après le malloc_error_break, je l'ai supprimé et maintenant ça marche. Un problème stupide mais si la solution ne fonctionne pas, assurez-vous que vous n'avez pas mis d'espace avant et après le malloc_error_break.

J'espère que ce message vous aidera

4voto

user3843991 Points 1

J'avais donné des permissions d'écriture que je ne devais pas avoir dans certains dossiers (notamment /usr/bin/), et cela a causé le problème. Je l'ai résolu en ouvrant l'Utilitaire de disque et en lançant 'Repair Disk Permissions' sur le disque dur du Macintosh.

0 votes

Merci, cela a réparé ma machine défectueuse.

-2voto

Govind P N Points 1016

La solution qui a fonctionné pour moi est ici.

static void inline _free(void const *p){
 if ((p == NULL) || !p || p == (void const *)'\0')
    return;
 if(strlen((const char *)p) == 0 )
    return;
free((void*)p);
p = NULL;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X