Udostępnij za pośrednictwem


Korzystanie z kompilacji debugowania do sprawdzania nadpisywania pamięci

Aby użyć kompilacji debugowania w celu sprawdzenia nadpisywania pamięci, należy najpierw ponownie skompilować projekt na potrzeby debugowania. Następnie przejdź do samego początku funkcji aplikacji InitInstance i dodaj następujący wiersz:

afxMemDF |= checkAlwaysMemDF;

Alokator pamięci debugowania umieszcza bajty ochrony wokół wszystkich alokacji pamięci. Jednak te bajty ochrony nie wykonują żadnych dobrych czynności, chyba że sprawdzisz, czy zostały zmienione (co oznaczałoby zastąpienie pamięci). W przeciwnym razie zapewnia to tylko bufor, który może w rzeczywistości pozwolić uciec z zastępowania pamięci.

Włączając element checkAlwaysMemDF, wymusisz wywołanie funkcji przez MFC za każdym razem, gdy zostanie wykonane wywołanie AfxCheckMemory new funkcji lub delete . Jeśli wykryto zastąpienie pamięci, wygeneruje komunikat TRACE podobny do następującego:

Damage Occurred! Block=0x5533

Jeśli widzisz jeden z tych komunikatów, musisz przejść przez kod, aby określić, gdzie wystąpiły szkody. Aby dokładniej odizolować miejsce, w którym wystąpiło zastąpienie pamięci, możesz wykonać jawne wywołania do AfxCheckMemory siebie. Na przykład:

ASSERT(AfxCheckMemory());
    DoABunchOfStuff();
    ASSERT(AfxCheckMemory());

Jeśli pierwsza funkcja ASSERT powiedzie się, a druga zakończy się niepowodzeniem, oznacza to, że zastąpienie pamięci musi mieć miejsce w funkcji między dwoma wywołaniami.

W zależności od charakteru aplikacji może się okazać, że afxMemDF program działa zbyt wolno, aby nawet testować. Zmienna afxMemDF powoduje AfxCheckMemory wywołanie dla każdego wywołania nowego i usunięcia. W takim przypadku należy rozproszyć własne wywołania do AfxCheckMemory( ), jak pokazano powyżej, i spróbować wyizolować pamięć w ten sposób.

Zobacz też

Naprawianie problemów kompilacji wydania