Compartir a través de


Cómo: Establecer puntos de interrupción en un número de asignación de memoria

Actualización: noviembre 2007

Este tema es aplicable a:

Edición

Visual Basic

C#

C++

Web Developer

Express

Sólo para código nativo

Standard

Sólo para código nativo

Pro y Team

Sólo para código nativo

Leyenda de la tabla:

Se aplica

No procede

Comando o comandos ocultos de manera predeterminada.

Nota:

Los cuadros de diálogo y comandos de menú que se ven podrían ser distintos de los incluidos en la Ayuda, dependiendo de la configuración activa o la versión usada. Para cambiar su configuración, elija la opción Importar y exportar configuraciones del menú Herramientas. Para obtener más información, vea Valores de configuración de Visual Studio.

El nombre de archivo y el número de línea del informe de pérdida de memoria indican dónde se encuentra asignada la memoria, pero esto no siempre es suficiente para identificar el problema. A menudo, una asignación de memoria recibirá llamadas muchas veces durante la ejecución de un programa, pero sólo perderá memoria en algunas llamadas. Para identificar el problema, se debe conocer no sólo dónde está asignada la memoria perdida sino también las condiciones en las que se produce la pérdida. La información que permite conocer esto es el número de asignación de memoria. Este número es el que aparece entre llaves después del nombre de archivo y del número de línea cuando éstos se muestran. Por ejemplo, en el resultado siguiente, el número de asignación de memoria es 18. Esto significa que la memoria perdida es el 18º bloque de memoria asignado en el programa.

Detected memory leaks!
Dumping objects ->
C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp(20) : {18} 
normal block at 0x00780E80, 64 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.

La biblioteca CRT cuenta todos los bloques de memoria asignados durante una ejecución del programa, incluida la memoria asignada por la propia biblioteca CRT o por otras bibliotecas, tales como MFC. Por lo tanto, un objeto con el número de asignación N será el enésimo objeto asignado en el programa, pero puede que no sea el enésimo objeto asignado por el código. En la mayoría de los casos, no lo será.

El número de asignación se puede utilizar para definir un punto de interrupción en la posición donde se asigna la memoria. Para ello, defina un punto de interrupción cerca del comienzo del programa. Cuando el programa se interrumpe en ese punto, se puede establecer un punto de interrupción de asignación de memoria desde el cuadro de diálogo Inspección rápida o la ventana Inspección.

Procedimiento

Para definir un punto de interrupción de asignación de memoria en la ventana Inspección

  1. En la ventana Inspección, escriba la siguiente expresión en la columna Nombre:

    _crtBreakAlloc
    

    Si está utilizando la DLL multiproceso de la biblioteca CRT (la opción /MD), incluya el operador de contexto, como se indica a continuación:

    {,,msvcr71d.dll}_crtBreakAlloc
    
  2. Presione RETORNO.

    El depurador evalúa la llamada y coloca el resultado en la columna Valor. Este valor será –1 si no se han definido puntos de interrupción sobre asignaciones de memoria.

  3. Reemplace el valor de la columna Valor con el número de asignación de la ubicación de memoria donde desea realizar la interrupción. Por ejemplo, 18 para interrumpir en la asignación de memoria mostrada en el resultado anterior.

Después de establecer puntos de interrupción sobre las asignaciones de memoria necesarias, puede continuar depurando. Debe ejecutar el programa bajo las mismas condiciones que la ejecución anterior, de modo que el orden de asignación de memoria no cambie. Cuando el programa se interrumpe en la asignación de memoria especificada, se puede examinar la ventana Pila de llamadas y otra información del depurador para determinar las condiciones en las que se asignó la memoria. Si es necesario, se puede continuar la ejecución del programa desde ese punto para ver lo que ocurre con el objeto y, quizás, poder determinar por qué no se desasignó correctamente.

Nota:

Puede resultar útil definir un punto de interrupción de datos sobre el objeto. Para obtener más información, vea Cómo: Establecer un punto de interrupción de datos (Sólo nativo).

Aunque normalmente es más fácil definir puntos de interrupción para asignación de memoria en el depurador, también puede establecerlos en el código, si lo prefiere.

Para definir un punto de interrupción de asignación de memoria en el código

  • Agregue una línea como ésta (para la asignación de memoria número 18):

    _crtBreakAlloc = 18;
    

Como alternativa, puede utilizar la función _CrtSetBreakAlloc, que produce el mismo efecto:

_CrtSetBreakAlloc(18);

Vea también

Tareas

Cómo: Utilizar la ventana Pila de llamadas

Conceptos

Detección y aislamiento de pérdidas de memoria

Otros recursos

Ventanas de variables