c ++ - Er Valgrind Memcheck som værktøj til Windows til at debug brug efter gratis fejl?

Indlæg af Hanne Mølgaard Plasc

Problem



Durring mit arbejde Jeg regelmæssigt står over for temmelig fælles programmeringsfejl - ved at bruge noget objekt, der allerede er frigivet. Dette påberåber UB i C ++. På linux bliver denne slags problemer normalt løst ved hjælp af Valgrind-værktøjsmembranen. Fra Memcheck manual: [8]



  Memcheck forsøger at fastslå, hvad den ulovlige adresse kan vedrøre,
  da det ofte er nyttigt. Så hvis det peger ind i en blok af hukommelse
  som allerede er frigivet, vil du blive informeret om dette og også
  hvor blokken blev befriet.



Memcheck giver mig call stack, hvor objektet blev hendelt, og jeg kan fortsætte og fejle problemet. Er der lignende værktøj til windows med samme funktionalitet, helst fri?

Bedste reference


Som Lailin Chen påpegede i sit svar på dette spørgsmål, prøv en af ​​disse:


Dr. Memory: https://github.com/dynamorio/drmemory[10]


UMDH: http://support.microsoft.com/kb/268343[11]


AppVerifier: http://msdn.microsoft.com/en-us/library/dd371695\%28v=vs.85\%29.aspx[12]

Andre referencer 1


Metoden, der fungerede for mig, var at skrive brugerdefineret hukommelsesadministrator, der giver globale operatører 'nyt' og 'slet' og lås hver frigjort/usued hukommelsesblok med VirtualProtect. På denne måde vil ethvert forsøg på at bruge frigivet hukommelse straks udløse adgangsforbrydelser, som du kan fange og fejle. For at kunne gøre dette skal du 'gribe' al tilgængelig hukommelse (eller 3/4 af det) ved hjælp af noget som VirtualAlloc og hver hukommelsesblok du returnerer (fra denne oprindeligt tildelte blok) skal være PAGE\_SIZE justeret (se GetSystemInfo dokumentation), ellers vil du ikke kunne låse det pålideligt. Det betyder, at selv trivial applikation kan kræve stor mængde hukommelse at bruge denne metode.


Hvad angår 'valgrind alternativ til windows' - har jeg ikke hørt om det. Nogen der er skrevet noget om, at det kan være muligt at kompilere/bruge valgrind med cygwin, men jeg ved ikke, om dette er sandt eller ej.

Andre referencer 2


Her er et valiant Valgring forsøg, og jeg ønsker dem det bedste:


http://sourceforge.net/p/valgrind4win/wiki/Home/[14]


Jeg er imidlertid bange for, at for at implementere en ordentlig 'Valgrind for Windows' er adgang til Windows-kildekode påkrævet.


IOW: Når grise flyver.

Andre referencer 3


Ifølge Dr. Memory dokumentation er der -delay\_frees\_stack mulighed med nøjagtig den samme Valgrind funktionalitet. Fra valgreference: [15]


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


Også her er et eksempel på fejl rapporteret af Dr. Memory: [16]


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:derekdrmemorygitsrc	estssuppress.c:110]
# 1 test                            [e:derekdrmemorygitsrc	estssuppress.c:269]
# 2 main                            [e:derekdrmemorygitsrc	estssuppress.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:derekdrmemorygitsrc	estssuppress.c:269]
Note: # 1 main                            [e:derekdrmemorygitsrc	estssuppress.c:297]
Note: instruction: mov    (\%eax) -> \%eax

Andre referencer 4


Hvad fungerede bedst for mig, var at bruge visuel lækage detektor, alt hvad jeg skulle gøre var at inkludere: [17]


#include <vld.h>


i starten af ​​eksekverbarhederne ønskede jeg at teste. Så kører en fejlsøgning eksekverbar fra inden for vinduer, ville give detaljerede oplysninger om alt lækket hukommelse. Fra output kan du direkte komme til den linje, hvor hukommelsen blev tildelt, så du kan passe på