Uso de _crtBreakAlloc para depurar una asignación de memoria
En este artículo se describe cómo usar _crtBreakAlloc para depurar una asignación de memoria.
Versión original del producto: Visual C++
Número de KB original: 151585
Resumen
Cuando se realiza el seguimiento de fugas de memoria mediante C-Runtime (CRT) de depuración, a menudo resulta útil establecer un punto de interrupción inmediatamente antes de asignar la memoria que provoca la pérdida. Si establece _crtBreakAlloc en tiempo de compilación o en tiempo de ejecución, puede provocar un punto de interrupción definido por el usuario en un punto específico de asignación de memoria.
Más información
Al realizar el seguimiento de pérdidas de memoria con funciones de Debug-CRT, como _CrtDumpMemoryLeaks, a menudo aparece un número de asignación entre llaves ({}). Por ejemplo, lo siguiente es una pérdida de memoria en el número de asignación 18:
¡Pérdidas de memoria detectadas!
Dumping objects ->
{18} bloque normal a 0x00660BE4, 10 bytes de largo
Data: < > CD CD CD CD CD CD CD CD CD CD
Volcado de objetos completado.
Es útil establecer un punto de interrupción justo antes de asignar esta memoria para que pueda recorrer la pila de llamadas y ver qué funciones hacen que esta memoria se asigne. Función Debug-CRT _CrtSetBreakAlloc que permite especificar un número de asignación en el que se va a interrumpir. Este método requiere que vuelva a compilar el programa cada vez que desee establecer un punto de interrupción de asignación. Un método alternativo consiste en usar la ventana Inspección y establecer el punto de interrupción de asignación dinámicamente. Este método tiene la ventaja de no requerir cambios en el código fuente ni volver a compilar.
Si va a vincular estáticamente al tiempo de ejecución de C, la variable que desea cambiar se denomina _crtBreakAlloc. Si va a vincular dinámicamente al tiempo de ejecución de C, la variable que desea cambiar en la ventana Inspección es {,,msvcr40d.dll}__p__crtBreakAlloc() si usa Visual C++ 4.0 o 4.1. La variable que desea cambiar en la ventana Inspección debe ser {,,msvcrtd.dll}__p__crtBreakAlloc() si usa Visual C++ 4.2 o posterior.
Para determinar con qué versión de CRT se va a compilar:
En el menú Compilar, elija Configuración.
En el panel Configuración para: , seleccione la configuración para la que está compilando. Elija la pestaña C/C++ y, a continuación, seleccione la categoría Generación de código .
Debería aparecer el cuadro de diálogo Usar biblioteca en tiempo de ejecución para mostrar la versión de CRT que está usando. (Si esta configuración está en blanco, asegúrese de que solo ha seleccionado una configuración en el Configuración para el panel: ).
Para establecer un punto de interrupción de asignación dinámicamente, siga estos pasos:
Inicie la sesión de depuración. En el menú Compilar, elija Depurar -> paso a paso por instrucciones. Si usa "Debug Single-Threaded" o "Debug Multi-Threaded CRT", siga el paso 1a. De lo contrario, siga el paso 1b.
Escriba _crtBreakAlloc en la ventana Inspección. Esto muestra el número de asignación actual en el que se detendrá el programa. Este número de asignación debe ser -1 cuando se inicie el programa por primera vez.
Escriba {,,msvcr40d.dll}__p__crtBreakAlloc() en la ventana Inspección si usa Visual C++ 4.0 o 4.1. Escriba {,,msvcrtd.dll}__p__crtBreakAlloc() si usa Visual C++ 4.2 o posterior. Esto muestra el número de asignación actual en el que se detendrá el programa. Este número de asignación debe ser -1 cuando se inicie el programa por primera vez.
Haga doble clic en el valor -1 y escriba el nuevo número de asignación que provoca un punto de interrupción definido por el usuario.
En el menú Depurar, elija DepurarGo -> .
Para obtener más información sobre _crtBreakAlloc, consulte Seguimiento de solicitudes de asignación de montón en la Ayuda en línea.