2012-03-28 2 views
21

Während meiner Arbeit habe ich regelmäßig ziemlich häufige Programmierfehler - mit einem Objekt, das bereits freigegeben wurde. Dies ruft UB in C++ auf. Auf Linux, diese Art von Problemen werden in der Regel mithilfe Valgrind Tool Memcheck gelöst. Von Memcheck manual:Gibt es Valgrind Memcheck wie Werkzeug für Windows zum Debuggen nach freien Fehlern verwenden?

Memcheck versucht festzustellen, was die illegale Adresse, beziehen könnte, da diese oft nützlich ist. Also, wenn es in einen Speicherblock zeigt, der bereits freigegeben wurde, werden Sie darüber informiert, und auch , wo der Block freigegeben wurde.

Memcheck bietet mir Call-Stack, wo das Objekt freigegeben wurde und ich kann weitermachen und das Problem debuggen. Gibt es ein ähnliches Werkzeug für Windows mit der gleichen Funktionalität, vorzugsweise kostenlos?

+0

Ich hatte viel Glück mit Purify in der Vergangenheit, aber es ist definitiv nicht kostenlos. –

+2

http://stackoverflow.com/questions/413477/is-there-a-good-valgrind-substitute-for-windows – stanwise

+0

Wenn Sie an einer Antwort für nur C interessiert sind, habe ich eine. –

Antwort

4

Laut Dr. Memory Dokumentation gibt es -delay_frees_stack Option mit genau der gleichen Valgrind-Funktionalität.Von Option Reference:

-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. 

Auch hier ist ein Beispiel für error reported by 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 
17

Als Lailin Chen this Frage in seiner Antwort wies darauf hin, eine dieser versuchen:

Dr. Gedächtnis: 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

+0

Ich habe AppVerifier ausprobiert, es gibt nicht an, wo das Objekt freigegeben wurde. – ks1322

+1

Application Verifier sollte dies mit vollem Speicherschutz erfassen. Wenn Sie das Objekt freigeben, schützt es die freigegebenen Seiten, was dazu führt, dass zukünftige Operationen darauf eine Ausnahme auslösen. –

+0

AppVerifier ist Mist, wenn ein Programm mit es einen Haltepunkt in Intel TBB-Code löst ... crappy Programm, aber idk vielleicht ist es in Ordnung, wenn Sie diese Prüfung deaktivieren – NoSenseEtAl

5

The method that worked for me war Schreiben Sie einen benutzerdefinierten Speichermanager, der die globalen Operatoren "new" und "delete" bereitstellt, und sperren Sie jeden freigegebenen/verwendeten Speicherblock mit VirtualProtect. Auf diese Weise löst jeder Versuch, freien Speicher zu verwenden, sofort Zugriffsverletzung aus, die Sie abfangen und debuggen können. Um dies zu tun, müssen Sie jedoch den gesamten verfügbaren Speicher (oder 3/4 davon) mit etwas wie VirtualAlloc "greifen" und jeder Speicherblock, den Sie zurückgeben (von diesem ursprünglich zugewiesenen Block) muss PAGE_SIZE ausgerichtet sein (siehe GetSystemInfo Dokumentation), sonst können Sie es nicht zuverlässig sperren. Dies bedeutet, dass selbst triviale Anwendungen viel Speicherplatz benötigen, um diese Methode zu verwenden.

Wie "Valgrind Alternative für Windows" - Ich habe davon noch nicht gehört. Jemand hat irgendwo geschrieben, dass es möglich ist, Valgrind mit Cygwin zu kompilieren, aber ich weiß nicht, ob das stimmt oder nicht.

4

Hier ist ein tapferer Valgring Versuch, und ich wünsche ihnen das Beste:

http://sourceforge.net/p/valgrind4win/wiki/Home/

Ich fürchte aber, dass, um eine richtige „Valgrind für Windows“, den Zugriff auf Windows-Quellcode zu implementieren Wird benötigt.

IOW: Wenn Schweine fliegen.

+0

Warum sollte Zugriff auf Windows-Quellcode erforderlich sein? – Jeff

3

Was für mich am besten funktioniert Visual leak Detector wurde mit, alles, was ich brauchte, war zu tun sind:

#include <vld.h> 

Zu Beginn der Executables wollte ich testen. Das Ausführen einer Debug-ausführbaren Datei innerhalb von Windows würde detaillierte Informationen über den gesamten ausgelaufenen Speicher bereitstellen. Von der Ausgabe können Sie direkt zu der Zeile gelangen, wo der Speicher zugewiesen wurde, so können Sie darauf achten,