Détecter des memory leaks dans les programmes C?

Si nous souhaitons vérifier les memory leaks dans un programme C ++, nous pouvons surcharger les new opérateurs et delete opérateurs de delete pour garder une trace de la mémoire allouée. Et si nous souhaitions vérifier les fuites dans un programme C? Puisqu’il n’y a pas de surcharge d’opérateur en C, pouvons-nous malloc pointeur de fonction malloc pour intercepter les appels à malloc et suivre l’allocation de mémoire? Existe-t-il un moyen plus simple d’utiliser des utilitaires externes? Veuillez fournir du code car je ne suis pas familier avec les pointeurs de méthode d’écriture.

Note: Je voudrais faire ceci sans aucun utilitaire externe pour la pratique.

Comme suggéré, il existe déjà d’excellents outils comme Valgrind pour le faire.

Plus loin:

Je voudrais faire cela sans aucun utilitaire externe pour la pratique
Ceci est intéressant et je suis sûr que serait épanouissant,
Vous pouvez utiliser une astuce macro pour détecter une telle utilisation de la mémoire et des erreurs de fuite, écrivez en fait votre propre détecteur de fuite. Vous devriez pouvoir le faire tant que vous avez une seule fonction d’allocation et de désallocation dans votre projet.

 #define malloc(X) my_malloc( X, __FILE__, __LINE__, __FUNCTION__) void* my_malloc(size_t size, const char *file, int line, const char *func) { void *p = malloc(size); printf ("Allocated = %s, %i, %s, %p[%li]\n", file, line, func, p, size); /*Link List functionality goes in here*/ return p; } 

Vous conservez une liste chaînée d’adresses allouées avec le numéro de fichier et de ligne à partir de l’endroit où elles ont été allouées. Vous mettez à jour la liste des liens avec les entrées de votre malloc .

Semblable à ce qui précède, vous pouvez écrire free une implémentation, dans laquelle vous vérifiez les entrées d’adresse demandées pour être libérées dans votre liste liée. S’il n’y a pas d’entrée correspondante, c’est une erreur d’utilisation et vous pouvez le signaler.

À la fin de votre programme, vous imprimez ou écrivez le contenu de votre liste chaînée dans un fichier journal. S’il n’y a pas de fuites, votre liste chaînée ne devrait pas contenir d’entrées, mais s’il y en a, le fichier journal vous indique l’emplacement exact de l’emplacement où la mémoire a été allouée.

Notez qu’en utilisant cette astuce macro, vous perdez la vérification du type des fonctions mais c’est une astuce intéressante que j’utilise souvent.

J’espère que cela aide et tout le meilleur 🙂

Valgrind est ce dont vous avez besoin.

Je me souviens d’avoir lu le premier chapitre d’ Algorithms in a Nutshell qui en parlait bien qu’il n’incluait pas de code. Juste ajouté au cas où vous le trouverez intéressant.

puisqu’il n’y a pas de surcharge d’opérateur dans c, peut-on écraser un sharepoint fonction malloc pour intercepter les appels de malloc et suivre l’allocation de mémoire

En fait, vous pouvez. Donnez à LD_PRELOAD une lecture.

En plus de la réponse de @ Als qui encapsulera les appels dans votre code source, si vous utilisez gnu ld , vous pouvez faire en sorte que l’éditeur de liens encapsule tous les appels (vraisemblablement vers malloc , realloc , calloc et free ) au moment du lien, peu importe où. ils viennent de. Vous écrivez ensuite __wrap_malloc etc et pouvez appeler la fonction d’origine avec, par exemple, __real_malloc .

Voir --wrap=symbol dans http://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_node/ld_3.html

Je ne sais pas comment cela fonctionne avec les appels de bibliothèques partagées. Je suppose que ce n’est pas le cas.

Voici comment modifier malloc, crochets gratuits: Crochets pour Malloc

Utilisez la fonction mallinfo cela a fonctionné pour moi sur Xilinx Zynq baremetal en utilisant Xilinx SDK gcc. J’ai testé avec une fuite de mémoire intentionnelle – je ne sais pas pourquoi, mais les résultats de Google sont incroyablement pénibles à trouver cette solution. Faites passer le mot pour aider les autres développeurs!