Application Verifier в сочетании с Средства отладки для Windows - удивительная настройка. Вы можете получить как часть Windows Driver Kit, так и более легкий Windows SDK . (Узнал о Application Verifier при исследовании более раннего вопроса о проблеме повреждения кучи .) В прошлом я также использовал BoundsChecker и Insure ++ (упомянутые в других ответах), хотя я был удивлен, насколько много функциональности было в приложении Verifier.
Electric Fence (он же "efence"), dmalloc , valgrind и так далее, стоит упомянуть, но большинство из них гораздо проще запустить под * nix, чем Окна. Valgrind смехотворно гибок: я отлаживал программное обеспечение для больших серверов со многими проблемами кучи, используя его.
Когда ничего не помогает, вы можете предоставить своему собственному глобальному оператору перегрузки new / delete и malloc / calloc / realloc - как это будет варьироваться в зависимости от компилятора и платформы - и это будет немного инвестиции - но это может окупиться в долгосрочной перспективе. Список желаемых функций должен выглядеть знакомым по dmalloc и electricfence, а также поразительно превосходной книге Написание твердого кода :
- значения часового режима : оставьте немного больше места до и после каждого выделения, соблюдая требования максимального выравнивания; заполнить магическими числами (помогает улавливать переполнения и переполнения буфера и случайный «дикий» указатель)
- alloc fill : заполнить новые выделения волшебным значением, отличным от 0 - Visual C ++ уже сделает это за вас в сборках Debug (помогает перехватить использование неинициализированных переменных)
- free fill : заполнить освобожденную память магическим значением, отличным от 0, предназначенным для запуска segfault, если в большинстве случаев разыменовывается (помогает отлавливать висячие указатели)
- без задержки : не возвращать освобожденную память в кучу некоторое время, держать ее свободной, но не доступной (помогает отлавливать больше висячих указателей, ловит ближайшие двойные освобождения)
- отслеживание : возможность записи того, где было сделано выделение, иногда может быть полезной
Обратите внимание, что в нашей локальной доморощенной системе (для встроенной цели) мы держим отслеживание отдельно от большинства других вещей, потому что время выполнения намного выше.
Если вас интересуют другие причины перегрузки этих функций / операторов распределения, взгляните на мой ответ на «Любая причина перегрузить глобальный оператор new и delete?» ; Помимо бесстыдного саморекламы, в нем перечислены другие методы, которые помогают отслеживать ошибки повреждения кучи, а также другие применимые инструменты.
Поскольку я продолжаю находить здесь свой собственный ответ при поиске значений alloc / free / fence, которые использует MS, вот другой ответ, который охватывает значения заполнения Microsoft dbgheap .