Y at-il Valgrind Memcheck comme outil pour windows pour déboguer l'utilisation après des erreurs gratuites? [fermé]
Pendant mon travail, je fais régulièrement face à une erreur de programmation plutôt commune-en utilisant un objet qui a déjà été libéré. Cela appelle UB en C++. Le linux, ce genre de problèmes sont généralement résolus en utilisant l'outil Valgrind Memcheck. De Manuel Memcheck :
Memcheck essaie d'établir à quoi l'adresse illégale pourrait se rapporter, car c'est souvent utile. Donc, si elle pointe dans un bloc de mémoire qui a déjà été libéré, vous serez informé de cela, et également où le bloc a été libéré.
Memcheck me fournit une pile d'appels, où l'objet a été désalloué et je peux continuer et déboguer le problème. Existe-t-il un outil similaire pour windows avec la même fonctionnalité, de préférence gratuite?
5 réponses
Comme Lailin Chen l'a souligné dans sa réponse à cette question Essayez l'une de ces questions:
Dr Mémoire: https://github.com/dynamorio/drmemory
UMDH: http://support.microsoft.com/kb/268343
AppVerifier: http://msdn.microsoft.com/en-us/library/dd371695%28v=vs.85%29.aspx
La méthode qui a fonctionné pour moi était d'écrire un gestionnaire de mémoire personnalisé qui fournit aux opérateurs globaux "new" et "delete", et verrouille chaque bloc de mémoire libéré/utilisé avec VirtualProtect. De cette façon, toute tentative d'utilisation de la mémoire libérée déclenchera immédiatement une violation d'accès que vous pourrez attraper et déboguer. Cependant, pour pouvoir le faire, vous devez "saisir" toute la mémoire disponible (ou 3/4 de celle-ci) en utilisant quelque chose comme VirtualAlloc
et chaque bloc de mémoire que vous retournez (à partir de ce bloc initialement alloué) doit être PAGE_SIZE
aligned (voir la documentation GetSystemInfo
), sinon vous ne pourrez pas le verrouiller de manière fiable. Ce qui signifie que même une application triviale peut nécessiter une grande quantité de mémoire pour utiliser cette méthode.
Quant à "Valgrind alternative pour windows" - je n'en ai pas entendu parler. Quelqu'un a posté quelque part qu'il pourrait être possible de compiler/utiliser valgrind avec cygwin, mais je ne sais pas si c'est vrai ou non.
Voici une vaillante tentative de Valgring, et je leur souhaite le meilleur:
Http://sourceforge.net/p/valgrind4win/wiki/Home/
J'ai peur, cependant, que pour implémenter un bon "Valgrind Pour Windows", l'accès au code source de Windows est requis.
IOW: quand les cochons volent.
Selon la documentation de Dr. Memory, il existe une option -delay_frees_stack
avec exactement la même fonctionnalité Valgrind. De Option Référence :
-delay_frees_stack
default: false
Record callstacks on free to use when reporting use-after-free or other errors that overlap with freed objects. There is a slight performance hit incurred by this feature for malloc-intensive applications.
Voici également un exemple d'erreur signalée par dr. Memory :
Here is another example, using the -delay_frees_stack option to obtain the callstack of the freed memory:
Error #8: UNADDRESSABLE ACCESS: reading 0x001338a8-0x001338ac 4 byte(s)
# 0 unaddr_test1 [e:\derek\drmemory\git\src\tests\suppress.c:110]
# 1 test [e:\derek\drmemory\git\src\tests\suppress.c:269]
# 2 main [e:\derek\drmemory\git\src\tests\suppress.c:297]
Note: @0:00:02.141 in thread 3024
Note: next higher malloc: 0x001338e8-0x00133938
Note: prev lower malloc: 0x001337e8-0x00133820
Note: 0x001338a8-0x001338ac overlaps memory 0x001338a8-0x001338c4 that was freed here:
Note: # 0 test [e:\derek\drmemory\git\src\tests\suppress.c:269]
Note: # 1 main [e:\derek\drmemory\git\src\tests\suppress.c:297]
Note: instruction: mov (%eax) -> %eax
Ce qui fonctionnait le mieux pour moi était d'utiliser Détecteur de fuite visuel , Tout ce que je devais faire était d'inclure:
#include <vld.h>
Au début des exécutables que je voulais tester. Ensuite, l'exécution d'un exécutable de débogage à partir de windows fournirait des informations détaillées sur toute la mémoire divulguée. De la sortie, vous pouvez directement accéder à la ligne où la mémoire a été allouée, de sorte que vous pouvez prendre soin