Application Verifier combinado con Debugging Tools for Windows es una configuración increíble. Puede obtener ambos como parte del Kit de controladores de Windows o el SDK de Windows más ligero . (Descubrí Application Verifier cuando investigé una pregunta anterior sobre un problema de corrupción del montón ). También he usado BoundsChecker e Insure ++ (mencionado en otras respuestas) en el pasado, aunque me sorprendió cuánta funcionalidad había en Application Verifier.
Cerca eléctrica (también conocida como "efence"), dmalloc , valgrindVale la pena mencionar , etc., pero la mayoría de estos son mucho más fáciles de ejecutar con * nix que Windows. Valgrind es ridículamente flexible: he depurado un gran software de servidor con muchos problemas de montón al usarlo.
Cuando todo lo demás falla, puede proporcionarle a su propio operador global nuevas / eliminar y sobrecargas de malloc / calloc / realloc; cómo hacerlo variará un poco dependiendo del compilador y la plataforma, y esto será una pequeña inversión. pero puede dar sus frutos a largo plazo. La lista de características deseables debería ser familiar por dmalloc y cerca eléctrica, y el libro sorprendentemente excelente Writing Solid Code :
- valores centinela : permiten un poco más de espacio antes y después de cada asignación, respetando el requisito de alineación máxima; llenar con números mágicos (ayuda a detectar desbordamientos y desbordamientos del búfer, y el puntero "salvaje" ocasional)
- alloc fill : llene nuevas asignaciones con un valor mágico distinto de 0: Visual C ++ ya lo hará por usted en las compilaciones de depuración (ayuda a detectar el uso de variables no inicializadas)
- Relleno libre : rellene la memoria liberada con un valor mágico distinto de 0, diseñado para desencadenar una falla predeterminada si en la mayoría de los casos se desreferencia (ayuda a atrapar punteros colgantes)
- sin demora : no devuelva la memoria liberada al montón por un tiempo, manténgala libre pero no disponible (ayuda a capturar más punteros colgantes, captura la doble liberación próxima)
- seguimiento : poder registrar dónde se realizó una asignación a veces puede ser útil
Tenga en cuenta que en nuestro sistema local de elaboración casera (para un objetivo incrustado) mantenemos el seguimiento separado de la mayoría de las otras cosas, porque la sobrecarga del tiempo de ejecución es mucho mayor.
Si está interesado en más razones para sobrecargar estas funciones / operadores de asignación, consulte mi respuesta a "¿Alguna razón para sobrecargar al operador global nuevo y eliminar?" ; Dejando de lado la descarada autopromoción, enumera otras técnicas que son útiles para rastrear los errores de corrupción del montón, así como otras herramientas aplicables.
Debido a que sigo encontrando mi propia respuesta aquí cuando busco valores de aloc / free / fence que usa MS, aquí hay otra respuesta que cubre los valores de relleno de dbgheap de Microsoft .