Cómo usar _crtBreakAlloc para depurar una asignación de memoria


Resumen


Al rastrear las pérdidas de memoria mediante la depuración de C-Runtime (CRT), a menudo es útil establecer un punto de interrupción inmediatamente antes de asignar la memoria que provoca la pérdida. Si estableces _crtBreakAlloc en tiempo de compilación o en tiempo de ejecución, puedes crear un punto de interrupción definido por el usuario en un punto específico de asignación de memoria.

Más información


Cuando se realiza el seguimiento de pérdidas de memoria con funciones de depuración-CRT, como _CrtDumpMemoryLeaks, suele aparecer un número de asignación entre llaves ({}). Por ejemplo, la siguiente es una pérdida de memoria en el número de asignación 18:
   Detected memory leaks!   Dumping objects ->   {18} normal block at 0x00660BE4, 10 bytes long   Data: <          > CD CD CD CD CD CD CD CD CD CD   Object dump complete. 
Es útil establecer un punto de interrupción justo antes de que se asigne esta memoria, de modo que pueda pasar por la pila de llamadas y ver qué funciones están causando la asignación de esta memoria. La función DEBUG-CRT _CrtSetBreakAlloc que permite especificar un número de asignación en el que interrumpir. Este método requiere que se vuelva a compilar el programa cada vez que se desee establecer un punto de interrupción de asignación. Un método alternativo es usar la ventana Inspección y establecer dinámicamente el punto de interrupción de asignación. Este método tiene la ventaja de no requerir cambios de código fuente ni volver a compilar. Si va a vincular estáticamente con el tiempo de ejecución de C, la variable que desea cambiar se denomina _crtBreakAlloc. Si va a vincular dinámicamente con el tiempo de ejecución de C, la variable que desea cambiar en la ventana Inspección es {,, msvcr40d. dll} * __p__crtBreakAlloc () si está usando Visual C++ 4,0 o 4,1. La variable que desea cambiar en la ventana Inspección debe ser {,, msvcrtd. dll} * __p__crtBreakAlloc () si está usando Visual C++ 4,2 o una versión posterior. Para determinar qué versión de CRT está compilando:
  1. En el menú generar, elija Configuración.
  2. En el panel Configuración para:, seleccione la configuración para la que está creando el archivo. Elija la pestaña C/C++ y, a continuación, seleccione la categoría generación de código.
El cuadro de diálogo usar biblioteca en tiempo de ejecución debe mostrar la versión del CRT que está usando. (Si esta opción está en blanco, asegúrese de que solo ha seleccionado una configuración en el panel Configuración para:). Para establecer dinámicamente un punto de interrupción de asignación, siga estos pasos:
  1. Inicie la sesión de depuración. En el menú generar, elija depurar-> paso a paso. Si está usando la función "depurar único de subproceso" o "depurar CRT multiproceso", siga el paso 1A. En caso contrario, siga el paso 1B.
    1. Escriba _crtBreakAlloc en la ventana Inspección. 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 inicia el programa por primera vez.
    2. Escriba {,, msvcr40d. dll} * __p__crtBreakAlloc () en la ventana Inspección Si está usando Visual C++ 4,0 o 4,1. Escriba {,, msvcrtd. dll} * __p__crtBreakAlloc () si está usando Visual C++ 4,2 o una versión posterior. 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 inicia el programa por primera vez.
  2. Haga doble clic en el valor-1 e introduzca el nuevo número de asignación que provoca un punto de interrupción definido por el usuario.
  3. En el menú Depurar, elija Debug-> go.
Para obtener más información sobre _crtBreakAlloc, consulte "seguimiento de solicitudes de asignación en el montón" en la ayuda en pantalla.