Existe-t-il un bon substitut Valgrind pour Windows?

210

Je cherchais dans Valgrind pour aider à améliorer mon codage / débogage C lorsque j'ai découvert que c'était uniquement pour Linux - je n'ai aucun autre besoin ni intérêt de déplacer mon système d'exploitation vers Linux, donc je me demandais s'il existe un programme tout aussi bon pour Windows.

Canard
la source
Quels types de débogage envisagez-vous de faire? Valgrind est un ensemble d'outils assez riche, et les réponses ci-dessous pointent dans toutes sortes de directions. Avec un accent sur le débogage de fuite / allocation de mémoire.
jakobengblom2
1
Vous pouvez peut-être tester le code sur une machine Linux virtuelle à l'intérieur de votre Windows, juste au moment où vous devez le vérifier. vous pouvez partager le dossier de développement entre la machine virtuelle et non virtuelle. c'est-à-dire si le code est suffisamment portable.
Liran Orevi

Réponses:

29

Quelques bons outils commerciaux:

orip
la source
1
Purifier: vénérable mais toujours utile, comme le montre le nombre de changements de propriété de l'entreprise qui ont survécu!
Norman Ramsey
2
Insure ++ prend une éternité pour instrumenter votre code et pour exécuter votre code à l'exécution.
C Johnson
117

Comme l'a souligné jakobengblom2, valgrind a une combinaison d'outils. En fonction de celui dont vous parlez, il existe différentes contre-fenêtres. Je ne mentionnerai ici que l'OSS ou les outils gratuits.

1. MemCheck:

Dr. Memory. Il s'agit d'un outil relativement nouveau qui fonctionne très bien sous Windows 7. Ma fonctionnalité préférée est qu'il regroupe les piles d'allocation des mêmes fuites dans le rapport.

http://code.google.com/p/drmemory/

J'ai également utilisé UMDH ( http://support.microsoft.com/kb/268343 ) et l' ai trouvé silencieux utile et facile à configurer. Cela fonctionne de Win2000 à Win7.

AppVerifier est un incontournable de swissknife pour les développeurs de code natif Windows, son vérificateur de "mémoire" fait un travail similaire http://msdn.microsoft.com/en-us/library/dd371695%28v=vs.85%29.aspx

2. Callgrind:

Mon préféré est très endormi ( http://www.codersnotes.com/sleepy ) Il est minuscule mais très utile et facile à utiliser.

Si vous avez besoin de plus de fonctionnalités, AMD CodeAnalyst ™ Performance Analyzer est gratuit: http://developer.amd.com/documentation/videos/pages/introductiontoamdcodeanalystperformanceanalyzer.aspx

Les outils d'analyse des performances de Windows sont gratuits de Microsoft, pas très faciles à utiliser mais peuvent faire le travail si vous êtes prêt à passer du temps. http://blogs.microsoft.co.il/blogs/sasha/archive/2008/03/15/xperf-windows-performance-toolkit.aspx Télécharger: http://msdn.microsoft.com/en-us/performance / cc752957

3. Massif:

Des outils gratuits similaires (pas tout à fait exacts) sur les fenêtres sont:

VMMap de sysinternals: http://technet.microsoft.com/en-us/sysinternals/dd535533

! commande heap dans windbg: http://hacksoflife.blogspot.com/2009/06/heap-debugging-memoryresource-leak-with.html

4. Cachegrind:

Les outils de performances Windows mentionnés ci-dessus ont un certain niveau de capacité de profilage des échecs de cache L2 mais pas aussi bon et facile à utiliser que Cachegrind.

5. DRD:

Je n'ai encore rien trouvé de gratuit et aussi puissant sur Windows, le seul outil gratuit pour Windows que je trouve légèrement proche est le vérificateur de "verrouillage" dans AppVerifier: http://msdn.microsoft.com/en-us/library /dd371695%28v=vs.85%29.aspx

Lailin Chen
la source
2
Il existe également gperftools (anciennement Google PerfTools) . Ce n'est pas un remplacement valgrind (ce qui est vraiment) mais il a un nouveau malloc, un profileur de processeur, un profileur de tas et un vérificateur. Cela vaut le coup d'oeil car il est pris en charge sur Linux et Windows (y compris Mingw) et d'autres unités.
alexr
30

Pourquoi ne pas utiliser Valgrind + Wine pour déboguer votre application Windows? Voir http://wiki.winehq.org/Wine_and_Valgrind

(Chromium l'utilise pour rechercher des erreurs de mémoire dans la version Windows; consultez build.chromium.org et examinez les cascades expérimentales ou de mémoire et recherchez wine.)

Il y a aussi le Dr Memory, voir dynamorio.org/drmemory.html

Dan Kegel
la source
3
Parce que vous ne débogueriez pas une application Windows - vous débogueriez une application Linux.
John Dibling
33
Pas besoin de recompiler dans Wine. Transférez simplement vos fichiers .exe et .pdb vers une boîte Linux. Et vous ne débogueriez pas une application Linux; vous déboguez votre application Windows exacte.
Dan Kegel
2
Exactement, il vaut mieux utiliser la vraie chose qu'un clone boiteux: D Love valgrind.
alternative
11
Agréable! À partir de Windows, vous pouvez exécuter une machine virtuelle exécutant linux, exécutant votre logiciel dans le vin presque vm, dans le valgrind vm. Points bonus si windows est exécuté à partir d'un vm exécutant linux dans un vm windows :)
Imbrondir
15

Pour Visual C ++, essayez Visual Leak Detector . Lorsque je l'ai utilisé, il a détecté une fuite de mémoire lors d'un newappel et a renvoyé la ligne réelle dans le code source de la fuite. La dernière version peut être trouvée à http://vld.codeplex.com/ .

tgs_stdio
la source
Cela ne semble pas fonctionner pour moi. J'ai même essayé de créer un projet simple qui ne faisait pratiquement rien d'autre que d'allouer de la mémoire et de ne pas la libérer. VLD ne l'a pas détecté. : - |
Synetech
@Synetech inc. J'ai eu le même problème dans VS2010 ... L'utilisation de la dernière version de VLD a résolu mon problème
relaxxx
14

L'environnement de développement pour Windows que vous utilisez peut contenir ses propres outils. Visual Studio, par exemple, vous permet de détecter et d'isoler les fuites de mémoire dans vos programmes

dmityugov
la source
6
Il est très peu utile en pratique. Il enregistrera le nom de fichier / numéro de lin pour les allocations incriminées, mais il n'est informatif que si vous appelez directement malloc. Lorsque vous utilisez new / delete, il identifiera inutilement new.h comme code "incriminé".
user9665
3
Cela fonctionne correctement pour moi, en pointant la ligne droite même les nouveaux / supprimer sont utilisés.
Rodrigo
Mais cela fonctionnera-t-il si une fonction de bibliothèque alloue? Par exemple strdup.
Alex Budovski
1
Valdrind fait beaucoup plus que les fuites de mémoire, je l'utilise principalement pour trouver l'utilisation de la mémoire de pile et de tas libérée et non initialisée qui peut être incroyablement difficile à déboguer autrement.
ideasman42
1
@ user9665 Visual Leak Detector ( vld.codeplex.com ) fournit une pile d'appels complète pour chaque fuite de mémoire avec un minimum de modifications du code souce. Vérifiez l'exemple sur le site
KindDragon
14

je voudrais énumérer un outil, l'espoir sera utile

lire cet article pour plus de détails

  1. Purifier
  2. Vérificateur de limites
  3. Coverity (fondamentalement, c'est un analyseur de code, mais il détectera les fuites de mémoire en statique)
  4. Code lumineux
  5. dmalloc
  6. ccmalloc
  7. NJAMD
  8. YAMD
  9. Valgrind
  10. mpatrol
  11. Assurer ++
Satbir
la source
12

Il existe une partie Pageheap.exe des outils de débogage pour Windows. C'est gratuit et c'est essentiellement un allocateur / désallocateur de mémoire personnalisé.

Voir http://support.microsoft.com/kb/286470


la source
Pageheap / gflags m'a aidé à résoudre certains problèmes de corruption de tas désagréables.
the_mandrill
J'ai trouvé gflags+ gdb(de mingw) utile pour le diagnostic.
Jarekczek
8

En combinaison avec Visual Studio, j'utilise généralement Visual Leak Detector ou simplement _CrtDumpMemoryLeaks () qui est un appel api win32. Les deux n'ont rien d'extraordinaire mais ils font le travail.

Jasper Bekkers
la source
6

J'ai eu la chance d'utiliser Compuware DevPartner Studio dans le passé et c'était vraiment bien, mais c'est assez cher. Une solution moins chère pourrait être GlowCode , je viens de travailler avec une version 5.x et, malgré certains problèmes de connexion à un processus dont j'avais besoin pour déboguer, cela fonctionnait assez bien.

Manuel
la source
Cher oui. Il a été remboursé en un week-end, en utilisant simplement le profileur.
EvilTeach
5

Viusual Studio peut aider à détecter lui-même les fuites de mémoire. Voir Trucs et astuces Microsoft Visual C ++ -> section "Fuites de mémoire". Voir aussi ce post dans SO

Bien que le traçage réel ne soit possible qu'avec Team Edtion de Visual Studio.

fmuecke
la source
4

Voir le lien " Outils de test source " sur la page Test de contrôle qualité logiciel et ressources des outils de test pour une liste d'outils similaires.

J'ai utilisé BoundsChecker, DevPartner Studio et Intel V-Tune dans le passé pour le profilage. J'ai préféré V-Tune; vous pourriez émuler divers chipsets Intel et cela vous donnerait des conseils sur la façon d'optimiser pour cette plate-forme.

Patrick Cuff
la source
3

LeakDiag, UMDH, App Verifier, DebugDiag, sont tous des outils utiles pour améliorer la robustesse du code et trouver les fuites de mémoire.

Alex Budovski
la source
3

La bibliothèque Boost Test peut détecter les fuites de mémoire.

zr.
la source
3

Et le Purify ?

grigy
la source
Pas vraiment gratuit ... mais je suppose que vous pourriez trouver une licence de test à des fins de test.
David Rodríguez - dribeas
Lien mort au 04/02/2011 pour BoundsChecker.
dwj
2

Si vous développez avec Borland / CodeGear / Embarcadero C ++ Builder, vous pouvez utiliser CodeGuard.

Vince
la source
2

Plus ou moins tous les Profileurs incluent la vérification des fuites de mémoire et vous montrent la pile lorsque la mémoire a été allouée.

Je peux recommander Intels Parallel Inspector . Simple à utiliser et aucune recompilation nécessaire. La version d'essai dure 30 jours.

GlowCode et AtromatedQA incluent également de telles capacités. Ils offrent tous des essais gratuits.

Compuware DevPartner (alias BoundsChecker) dans Contrast a besoin d'une recompilation "d'instrumentation" ralentie et l'application s'exécute également plus lentement lors de la recherche d'erreurs. Et BoundsChecker ne peut pas du tout fonctionner avec des évsrions 64 bits. Nous avons abandonné cet outil.

RED SOFT ADAIR
la source
2
Je recommanderais sans aucun doute glowcode. Je l'ai utilisé dans le passé pour trouver une fuite de mémoire dans une DLL appelée par mon application.
Bob
Il y a eu des plaintes de ralentissements majeurs lors de l'utilisation de DevPartner sur mon dernier lieu de travail. Ils font tout pour éviter de l'utiliser en raison de sa lenteur.
Calyth
2

Le meilleur outil que j'ai jamais utilisé est DevPartner BoundsChecker - ce n'est pas gratuit mais il a une période d'évaluation.

Dror Helper
la source
2

Un autre outil de mémoire pour votre liste: Validateur de mémoire .

Pas gratuit, mais loin d'être aussi cher que Purify ou Boundschecker.

Stephen Kellett
la source
2

Nous venons de terminer un outil de vérification de la sécurité de la mémoire pour Windows, qui gère GCC et Micrsoft Visual C (pas encore C ++), et recherchons des testeurs bêta.

EDIT 12 juin 2011: Plus de version bêta, maintenant en production pour GCC et Microsoft Visual Studio C.

Ira Baxter
la source
1

J'ai utilisé Insure ++ qui fait un excellent travail pour trouver les fuites / corruptions de mémoire c ++ et de nombreux autres bugs comme les variables non initialisées, les erreurs de pointeur, les chaînes, etc. votre code .. Vous pouvez l'essayer pour la version trail ..

rouge
la source
1

Vous pouvez lire ce que Mozilla fait en ce qui concerne les fuites de mémoire. Un outil dans leur boîte à outils est le collecteur de déchets Hans Boehm utilisé comme détecteur de fuite de mémoire.

Cristian Adam
la source
1

Vous pouvez essayer la version d'essai de RuntimeChecker ou la version d' essai d' IBM Purify .

Une solution gratuite serait d'utiliser le code suivant dans Visual Studio:

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

Écrivez simplement ceci en haut de tous vos fichiers cpp. Cela détectera les fuites de mémoire de votre application lors de l'arrêt du débogage et les répertoriera dans la fenêtre de sortie. Double-cliquez sur une ligne de fuites de mémoire pour mettre en évidence la ligne où la mémoire est allouée et jamais libérée. Cela peut vous aider: http://www.flipcode.com/archives/How_To_Find_Memory_Leaks.shtml

Patrice Bernassola
la source