Windows 용 디버깅 도구 와 결합 된 Application Verifier 는 놀라운 설정입니다. Windows 드라이버 키트 또는 더 가벼운 Windows SDK 의 일부로 둘 다 얻을 수 있습니다 . ( 힙 손상 문제에 대한 이전 질문을 조사 할 때 Application Verifier에 대해 알게 되었습니다 .) 과거에도 BoundsChecker 및 Insure ++ (다른 답변에서 언급)를 사용했지만 Application Verifier의 기능이 얼마나 많은지 놀랐습니다.
Electric Fence (일명 "efence"), dmalloc , valgrind 등은 모두 언급 할 가치가 있지만 대부분 Windows보다 * nix에서 실행하기가 훨씬 쉽습니다. Valgrind는 엄청나게 융통성이 있습니다. 대용량 서버 소프트웨어를 사용하여 많은 힙 문제를 디버깅했습니다.
다른 모든 방법이 실패하면 자체 글로벌 운영자에게 new / delete 및 malloc / calloc / realloc 과부하를 제공 할 수 있습니다. 그렇게하는 방법은 컴파일러와 플랫폼에 따라 조금씩 다를 수 있으며 이는 약간의 투자입니다. 그러나 장기적으로 보답 할 수 있습니다. 바람직한 기능 목록은 dmalloc과 electricfence, 놀랍게도 훌륭한 Writing Writing Solid Code :
- 센트리 값 : 최대 정렬 요구 사항을 고려하여 각 할당 전후에 약간의 공간을 확보하십시오. 매직 넘버로 채움
- alloc fill : 0이 아닌 마법의 값으로 새로운 할당을 채 웁니다 .Visual C ++은 이미 디버그 빌드 에서이 작업을 수행합니다 (초기화되지 않은 var의 사용을 잡는 데 도움이 됨)
- free fill : 대부분의 경우 역 참조되는 경우 segfault를 트리거하도록 설계된 0이 아닌 매직 값으로 해제 된 메모리를 채 웁니다 (매달린 포인터를 잡는 데 도움이 됨)
- delayed free : 사용 가능한 메모리를 힙에 잠시 동안 반환하지 말고 여유 공간을 채우십시오.
- 추적 : 할당이 이루어진 위치를 기록 할 수 있으면 때로는 유용 할 수 있습니다
로컬 홈브류 시스템 (내장 된 대상의 경우)에서는 런타임 오버 헤드가 훨씬 높기 때문에 추적을 다른 항목과 별도로 유지합니다.
이러한 할당 기능 / 오퍼레이터를 오버로드해야하는 더 많은 이유에 관심이있는 경우 "전역 오퍼레이터를 새로로드하고 삭제하는 이유는 무엇입니까?"에 대한 나의 대답을 살펴보십시오. ; 뻔뻔한 자체 홍보 외에 힙 손상 오류를 추적하는 데 도움이되는 기타 기술과 기타 적용 가능한 도구가 나열되어 있습니다.
MS가 사용하는 alloc / free / fence 값을 검색 할 때 여기에서 내 자신의 답변을 계속 찾기 때문에 Microsoft dbgheap fill values에 대한 다른 답변이 있습니다 .