Dr. Memory : Memory Debugger for Windows and Linux

J’ai récemment eu un soucis majeur sur un outil que je développe de temps en temps pour le travail. J’avais depuis un moment une version fonctionnelle qui marchait plutôt bien. Mais ça, c’était avant, jusqu’à ce que je constate de plus en plus d’erreurs à apparition aléatoire, des erreurs telles que des erreurs segmentations et des la mémoire ne peut être read [resp. written] (1). Jusqu’à ce que l’ajout d’un printf() fasse planter le programme à la ligne 10 et que l’enlever règle totalement le problème.
(1) Oui, je suis sous Windows XP.

Le débogueur ne me servait à rien puisque les erreurs n’apparaissaient pas en mode pas à pas. Il me fallait donc un outil tel que Valgrind pour faire une analyse de la mémoire et essayer de détecter des erreurs dans du code écrit plus d’un mois auparavant. Difficile d’avoir envie de chercher et d’être critique sur un code que  j’avais testé, qui marchait sans problème et que je ne mettais a priori pas en doute ! La fonction Memcheck de Valgrind est idéale sauf que je travaille sous Windows XP (voir note (1) ci-dessus), que je n’ai pas de Linux sous la main et que j’utilise du code non portable (Sleep() et autres fonctions de <windows.h> pour la gestion de la console) que je n’avais pas franchement envie de commenter en masse pour le rendre compilable sous Linux.

J’ai passé un coup de fil à mon ami Google pour trouver un logiciel sous Windows qui ferait le même taff que Valgrind. Et comme souvent avec Google, quand on cherche, on trouve ! Dr Memory se présente comme un débogueur de mémoire pour Windows et Linux, pour identifier les erreurs de programmation telles que « les accès de de la mémoire non initialisée, les accès à la mémoire non adressable, les accès à la mémoire libérée, les doubles libérations, les fuites de mémoire ». Il est disponible sous licence LGPL. Il se prétend plus rapide que Valgrind (plus exactement Memcheck qu’il concurrence). Bref, il me semble très bien ce petit !

Aussitôt trouvé, aussitôt téléchargé et je lui donne à manger mon exécutable récalcitrant. Pour cela, rien, de plus simple : il suffit de faire un glisser-déposer de l’icône mon application sur l’icône de Dr. Memory. Résultats (extraits des ~) des courses :

Error #3: UNADDRESSABLE ACCESS: writing 0x003f3d16-0x003f3d17 1 byte(s)
# 0 drmemorylib.dll!replace_strcpy [e:\src\drmemory\withwiki\trunk\drmemory\replace.c:431]
# 1 MenuEntry_init               [d:/.../menu.c:38]
# 2 main                         [d:/.../test.c:17]
Note: @0:00:00.234 in thread 4296
Note: refers to 1 byte(s) beyond last valid byte in prior malloc
Note: prev lower malloc:  0x003f3d08-0x003f3d16
Note: instruction: mov    $0x00 -> (%ecx)

Ah ? Ligne 38 dans menu.c ? Regardons :

MenuEntry_t *MenuEntry_init(const char *txt, F *act)
{
    // Allocate memory
    MenuEntry_t *item = malloc( sizeof(MenuEntry_t) );

    // Initialize members
    item->text = malloc( strlen(txt) );
    strcpy(item->text, txt);  // a la ligne 38 dans le fichier original
    item->action = act;

    return item;
}

Captain Obvious a encore frappé ! Il manque un +1 dans le malloc(). Beautiful ! Une fois cette « petite » correction faite, le programme n’a plus planté.

Mon conseil du jour est d’être rigoureux quand vous codez…… non, ça c’est le conseil de tous les jours. Mon conseil du jour est passez vos programmes au débogueur mémoire, passez vos programmes dans Dr Memory !

Pour télécharger Dr Memory : http://code.google.com/p/drmemory/downloads/list

Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s