Application Verifier w połączeniu z Debugging Tools for Windows to niesamowita konfiguracja. Możesz uzyskać oba jako część zestawu Windows Driver Kit lub lżejszego Windows SDK . (Dowiedziałem się o Application Verifier podczas badania wcześniejszego pytania o problem z uszkodzeniem sterty ). W przeszłości również korzystałem z BoundsChecker i Insure ++ (wspomnianych w innych odpowiedziach), chociaż byłem zaskoczony, ile funkcji jest w Application Verifier.
Warto wspomnieć o Electric Fence (aka „efence”), dmalloc , valgrind i tak dalej, ale większość z nich jest znacznie łatwiejsza do uruchomienia pod * nix niż Windows. Valgrind jest absurdalnie elastyczny: debugowałem oprogramowanie dużego serwera z wieloma problemami ze stertą, używając go.
Kiedy wszystko inne zawiedzie, możesz zapewnić własnego globalnego operatora przeciążenia new / delete i malloc / calloc / realloc - jak to zrobić, będzie się nieco różnić w zależności od kompilatora i platformy - i będzie to trochę inwestycja - ale na dłuższą metę może się opłacić. Lista pożądanych funkcji powinna wyglądać znajomo z dmalloc i electricfence oraz zaskakująco doskonałej książki Writing Solid Code :
- wartości wartowników : zapewniają trochę więcej miejsca przed i po każdym przydziale, przestrzegając maksymalnego wymogu dostosowania; wypełnij magicznymi liczbami (pomaga wychwycić przepełnienia i niedomiary bufora oraz sporadyczny „dziki” wskaźnik)
- przydziel wypełnienie : wypełnij nowe alokacje magiczną wartością różną od 0 - Visual C ++ zrobi to już za Ciebie w kompilacjach debugowania (pomaga złapać użycie niezainicjowanych zmiennych)
- bezpłatne wypełnienie : wypełnij zwolnioną pamięć magiczną wartością różną od 0, zaprojektowaną w celu wywołania segfault, jeśli jest wyłuskana w większości przypadków (pomaga złapać wiszące wskaźniki)
- opóźnione wolne : nie zwracaj zwolnionej pamięci na stos przez chwilę, utrzymuj ją jako wolną wypełnioną, ale niedostępną (pomaga złapać więcej zwisających wskaźników, łapie bliższe podwójne zwolnienia)
- śledzenie : możliwość zarejestrowania, gdzie dokonano alokacji, może być czasami przydatna
Zwróć uwagę, że w naszym lokalnym systemie homebrew (dla osadzonego celu) śledzenie jest oddzielone od większości innych rzeczy, ponieważ narzut czasu wykonywania jest znacznie wyższy.
Jeśli interesuje Cię więcej powodów, aby przeciążać te funkcje / operatory alokacji, spójrz na moją odpowiedź na pytanie „Czy jest jakiś powód, aby przeciążać operatora globalnego nowy i usunąć?” ; Pomijając bezwstydną autopromocję, wymienia inne techniki, które są pomocne w śledzeniu błędów uszkodzenia sterty, a także inne odpowiednie narzędzia.
Ponieważ wciąż znajduję tutaj własną odpowiedź, szukając wartości przydziału / wolnego / ogrodzenia, których używa MS, oto kolejna odpowiedź, która obejmuje wartości wypełnienia dbgheap firmy Microsoft .