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?

22
demandé sur ks1322 2012-03-28 20:31:28

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

17
répondu stanwise 2017-08-22 07:52:58

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.

5
répondu SigTerm 2017-05-23 12:00:16

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.

4
répondu 2013-01-06 16:21:15

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
4
répondu ks1322 2013-01-06 17:33:47

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

3
répondu Frank 2014-11-04 15:54:48