O Application Verifier combinado com o Debugging Tools for Windows é uma configuração incrível. Você pode obter ambos como parte do Windows Driver Kit ou do Windows SDK mais leve . (Descobri o Application Verifier ao pesquisar uma pergunta anterior sobre um problema de corrupção de heap .) Também usei o BoundsChecker e o Insure ++ (mencionados em outras respostas) no passado, embora tenha ficado surpreso com a quantidade de funcionalidade do Application Verifier.
Vale a pena mencionar o Electric Fence (também conhecido como "efence"), dmalloc , valgrind etc., mas a maioria deles é muito mais fácil de executar com * nix do que o Windows. O Valgrind é ridiculamente flexível: depurei um software de servidor grande com muitos problemas de pilha usando-o.
Quando tudo mais falhar, você poderá fornecer ao seu próprio operador global novas sobrecargas / delete e malloc / calloc / realloc - como fazer isso variará um pouco dependendo do compilador e da plataforma - e isso será um pouco de investimento - mas pode valer a pena a longo prazo. A lista de recursos desejáveis deve parecer familiar no dmalloc e no electricfence, e o surpreendentemente excelente livro Writing Solid Code :
- valores de sentinela : permita um pouco mais de espaço antes e depois de cada alocação, respeitando o requisito máximo de alinhamento; preencher com números mágicos (ajuda a capturar estouros e subfluxos de buffer e o ocasional ponteiro "selvagem")
- atribuir preenchimento : preencha novas alocações com um valor mágico diferente de 0 - o Visual C ++ já fará isso em compilações de depuração (ajuda a capturar o uso de vars não inicializados)
- preenchimento livre : preenche a memória liberada com um valor mágico diferente de 0, projetado para disparar um segfault se for desreferenciado na maioria dos casos (ajuda a capturar ponteiros pendentes)
- atraso na liberação : não retorne a memória liberada para a pilha por um tempo, mantenha-a cheia, mas não disponível (ajuda a capturar mais indicadores pendentes, captura a liberação dupla aproximada)
- rastreamento : poder registrar onde uma alocação foi feita às vezes pode ser útil
Observe que em nosso sistema local de homebrew (para um destino incorporado), mantemos o rastreamento separado da maioria dos outros itens, porque a sobrecarga de tempo de execução é muito maior.
Se você estiver interessado em mais motivos para sobrecarregar essas funções / operadores de alocação, dê uma olhada na minha resposta para "Qualquer motivo para sobrecarregar o operador global novo e excluir?"; autopromoção vergonhosa à parte, lista outras técnicas que são úteis para rastrear erros de corrupção de heap, além de outras ferramentas aplicáveis.
Como eu continuo encontrando minha própria resposta aqui ao pesquisar valores de alocação / livre / cerca que a MS usa, aqui está outra resposta que abrange os valores de preenchimento do dbgheap da Microsoft .