Sternmull hat geschrieben:Get so was mit Dr. Memory auch? Nach einem kurzen Blick in die Doku sieht es für mich so aus als würden dort grundsätzlich alle Allokationen aufgelistet werden.
Nicht direkt, aber indirekt; du kannst das folgendermaßen umgehen: Einfach die Leaks unterdrücken, die du nicht sehen willst. Das ist einmal am Anfang etwas Arbeit, die Callstacks in die Suppression-Datei zu kopieren; aber danach geht das ganz problemlos.
Sternmull hat geschrieben:Wenn aber bei der Initialisierung des Programms mal ein paar Megabyte angefordert werden die dann bis zum Ende nicht freigegeben werden, dann ist das normalerweise unkritisch.
Unkritisch wohl ja; unschön wohl auch. Wenigstens wird es durch die Suppressions explizit gemacht. ;) Dazu auch: Welche Arten es von Leaks es eigentlich gibt:
http://drmemory.org/docs/page_leaks.html hat geschrieben:- Memory that is still reachable by the application. This is NOT considered a leak. It is reported as "still-reachable allocation(s)" in Dr. Memory's summary. Many applications do not explicitly free memory whose lifetime matches the process lifetime and this is not considered an error by Dr. Memory.
- Memory that is definitely not reachable by the application (at least, not by an aligned pointer to the start or middle of the allocated block). This is called a "leak" by Dr. Memory, as there is no way for the application to free this memory: it has lost any handle it had to the memory.
- Memory that is reachable only via pointers to the middle of the allocation, rather than the head. This is called a "possible leak" by Dr. Memory. These may or may not be legimitate pointers to that allocation.
Sternmull hat geschrieben:Was kritisch ist sind bei langlebigen Programmen die Leaks die zu einem ständigen Zuwachs führen. Ich hatte da mal eins das wirklich nur wenige Bytes pro Minute geleaked hat. Nach ein paar Tagen kommt da natürlich eine auffallende Menge zusammen. Aber wenn man das debuggen will, möchte man nicht erst Tage warten. D.h. ich will dann nur wissen was zwischen einem Programmzustand A und einem Zustand B hinzugekommen ist. Das ganze Gerassel was davor passiert ist interessiert mich dann nicht (in dem würde mein kleines Leak sich ja nicht mehr auffallen).
Richtig; wie gesagt: Bei Dr. Memory läuft fast alles über die Suppressions. Aber du kannst wohl genau das über
-nudge (siehe
hier) erreichen. Ich habe es nicht ausprobiert, daher keine Garantien von mir.
Sternmull hat geschrieben:Es geht mir nicht darum Werbung für UMDH zu machen. Mich würde nur interessieren ob Dr. Memory denn wirklich die Features hat die für mich unverzichtbar sind. Aus einer Aussage wie "an Dr. Memory kommt kein anderes heran" geht das nicht eindeutig hervor :)
Ebenfalls ohne Werbung machen zu wollen gibt dir Dr. Memory Warnungen für:
- Schreib- oder Lesezugriffe auf nicht-allokierten Speicher (unaddressable access)
- Lesezugriffe auf allokierten Speicher, der nicht initalisiert wurde (uninitialized read)
- Ungültige Benutzung der Heap-Funktionen new und delete, new[] und delete[], malloc und free, und die Debug-Versionen der letzten beiden (invalid heap argument)
- Wie gesagt: Speicherlecks
Diese Features, die es auf anderen Platformen in der Regel mit Valgrind gibt, gibt es sonst unter Windows meines Wissens nach überhaupt nicht. Und zum Jammern: Ja, es braucht die Release-CRT und funktioniert nur für x86-Anwendungen. Was es genau macht, kannst du
hier nachlesen; die stecken wirklich verdammt viel Aufwand in die Code-Instrumentierung.