Utilice Visual Leak Detector para solucionar problemas de pérdidas de memoria

Tabla de contenido

1. Descripción general de las herramientas VLD

2. Descargue e instale VLD

2.1 Descargar VLD

2.2 Instalar VLD

3. Directorio de instalación de VLD y descripción del archivo

3.1 Directorio de instalación y descripción del archivo

3.2 Descripción detallada de las versiones de 32 y 64 bits

4. Introducir VLD en el proyecto.

5. Ejemplo de explicación de la detección de pérdidas de memoria

5.1 Error al iniciar el programa

5.2. Inicie la depuración y vea el informe de pérdida de memoria

5.3 Uso del archivo de configuración vld.ini

6. Finalmente


Resumen del desarrollo de funciones comunes de VC ++ (lista de artículos de columna, bienvenido a suscribirse, actualizaciones continuas ...) icono-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/124272585 Serie de tutoriales de solución de problemas de anomalías del software C ++ de entrada a la competencia (lista de artículos de la columna), bienvenido a suscribirse y continuar actualizando...) icono-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/125529931 Herramientas de análisis de software C ++ desde la entrada hasta la recopilación de casos de dominio (columna El artículo se está actualizando...) icono-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/131405795 C/C++ Basics and Advanced (artículo de columna, actualizado continuamente...) icono-default.png?t=N7T8https://blog.csdn.net /chenlycly/category_11931267.html        La pérdida de memoria es un problema común en los programas C/C++ es que las pérdidas de memoria son más dañinas. Si las pérdidas de memoria continúan durante mucho tiempo, causarán una excepción de falta de memoria y el programa fallará y fallará. Para el software a gran escala, con numerosos módulos comerciales y diseños complejos, la resolución de problemas puede ser difícil y puede resultar difícil localizarlos utilizando múltiples métodos de resolución de problemas. Es necesario que dominemos varios métodos para solucionar problemas de pérdidas de memoria. Cuando encuentre un problema y un método no pueda localizarlo, puede intentar utilizar otros métodos para solucionarlo. Hoy presentaremos una herramienta de pérdida de memoria, Visual Leak Detector (VLD para abreviar), y describiremos en detalle el proceso completo de uso de esta herramienta para solucionar problemas de pérdidas de memoria. Este artículo considera que muchos de mis amigos son desarrolladores novatos, así que lo explicaré con más detalle.

1. Descripción general de las herramientas VLD

        Visual Leak Detector es una herramienta de detección de fugas de memoria gratuita y de código abierto para C/C++. En comparación con otras herramientas de detección de pérdidas de memoria, tiene las siguientes características al detectar pérdidas de memoria:

1) Puede generar la pila de llamadas del punto de pérdida de memoria, y el nombre del archivo específico y el número de línea de código se mostrarán en la pila de llamadas de función; 2) Puede mostrar los datos completos en la memoria filtrada; 3)
No
es un programa exe que se ejecuta de forma independiente, pero una biblioteca dinámica dll, debe introducir la biblioteca en el proyecto y recompilar el código;
4) Su código fuente es de código abierto, publicado bajo la licencia GNU y tiene documentación y comentarios detallados. Es una buena opción para los lectores que desean aprender más sobre la administración de memoria dinámica y los mecanismos de solución de problemas de pérdida de memoria.

       Desde la perspectiva del uso, VLD es simple y fácil de usar. Para los usuarios, siempre que su código contenga el archivo de encabezado de VLD y la biblioteca dll de VLD se copie en el directorio del programa principal exe, el programa puede ser detectado. ejecutando el programa normalmente bajo depuración. Hay un problema de pérdida de memoria. Desde una perspectiva de investigación, el código fuente de VLD es de código abierto. Si profundiza en el código fuente, puede aprender los principios de la fragmentación y liberación de la memoria del montón, los principios de la verificación de la memoria y las técnicas comunes para las operaciones de la memoria de la máquina.

2. Descargue e instale VLD

       La última versión de VLD es 2.5.1. Vaya a la página oficial de VLD y descargue esta versión.

2.1 Descargar VLD

       Si encuentra la página oficial de Microsoft sobre VLD ( https://marketplace.visualstudio.com/items?itemName=ArkadyShapkin.VisualLeakDetectorforVisualC ), como se muestra a continuación:

Haga clic en el botón "Get Stated" para ingresar a la página de github de VLD:

Haga clic en el hipervínculo vld-2.5.1-setup.exe en la parte inferior de la página para descargar. La descarga fallará a mitad de camino.

       Puede ir a  la página https://kinddragon.github.io/vld/  y hacer clic en el botón "Descargar instalador" para descargar, de la siguiente manera:

2.2 Instalar VLD

       Primero vaya al sitio web para descargar el paquete de instalación de la última versión de Visual Leak Detector 2.5.1 e instálelo directamente después de la descarga. Durante el proceso de instalación, se le pedirá que elija si desea agregar VLD a las variables de entorno y a Visual Studio. No es necesario que lo marque aquí. No es necesario que lo configure automáticamente para nosotros. Podemos configurarlo manualmente en el proyecto cuando necesitamos usar VLD.

3. Directorio de instalación de VLD y descripción del archivo

       VLD no es un programa exe que se ejecuta de forma independiente, sino una biblioteca dll. Por lo tanto, el paquete de instalación de VLD contiene los archivos de encabezado .h, los archivos de biblioteca .lib y .dll compilados por VLD. No instala un programa exe ejecutable. , simplemente libere estos en el directorio de instalación.

3.1 Directorio de instalación y descripción del archivo

       VLD se instala por defecto en la ruta C:\Program Files (x86)\Visual Leak Detector, podemos ir al directorio de instalación para echar un vistazo, que contiene principalmente 3 carpetas:

        La carpeta de inclusión contiene los archivos de encabezado de la biblioteca VLD, de la siguiente manera:

       El archivo vld.lib se almacena en la carpeta lib, hay dos versiones, una es vld.lib para Win32 y la otra es vld.lib para Win64. Los archivos binarios como dll se almacenan en la carpeta bin, como se muestra a continuación:

También hay versiones de 32 y 64 bits.

       También se utilizarán paquetes de instalación similares al compilar el código fuente abierto de libcurl. La biblioteca libcurl llamará internamente a la interfaz de la biblioteca de código abierto openssl, pero la biblioteca openssl no se proporciona en el código fuente de la biblioteca libcurl. Podemos descargar el paquete de instalación de openssl desde sitio web Esta instalación El paquete contiene los archivos de biblioteca y los archivos de encabezado de openssl, es decir, los archivos de biblioteca y los archivos de encabezado publicados están en el directorio de instalación.

3.2 Descripción detallada de las versiones de 32 y 64 bits

        Cuando utilice IDE para compilar programas de Windows, puede compilar 32 bits (correspondiente a x86) o 64 bits (correspondiente a x64). Solo se pueden ejecutar programas de 32 bits en un sistema Windows de 32 bits y no se pueden ejecutar programas de 64 bits. Un sistema Windows de 64 bits puede ejecutar programas de 64 bits o programas de 32 bits (lo que proporciona compatibilidad con programas de 32 bits).

        Es posible que los sistemas Windows más antiguos todavía sean de 32 bits; por ejemplo, algunos sistemas Win7 todavía son de 32 bits. Sin embargo, los sistemas Win10 y Win11 relativamente nuevos son todos sistemas de 64 bits. Para ser compatible con sistemas Windows de 32 bits, muchos programas compilan directamente el software en programas de 32 bits, de modo que los programas puedan ejecutarse en sistemas Windows de 32 y 64 bits.

       También hay muchos programas que proporcionan paquetes de instalación de 32 bits y paquetes de instalación de 64 bits, para que los usuarios puedan elegir la versión correspondiente para instalar según sus propias necesidades. Si es un sistema Windows de 32 bits, solo se puede instalar el paquete de instalación de 32 bits; si es un sistema Windows de 64 bits, se pueden instalar paquetes de instalación tanto de 32 bits como de 64 bits.

       Desde la perspectiva del desarrollador, hay dos puntos a tener en cuenta:

1) Existe una gran diferencia en el tamaño de la memoria virtual asignada por los procesos de programa de 32 y 64 bits en el sistema.
        Para los programas de 32 bits, el sistema asignará 2 a la potencia 32 de memoria virtual al programa iniciado. , es decir, 4GB. Para los programas de 64 bits, el sistema asignará 2 a la potencia 64 de memoria virtual al proceso del programa, es decir, la memoria virtual es muy grande, mucho más grande que la memoria virtual de 4 GB de los programas de 32 bits. Para programas de 32 bits, 2 GB es memoria en modo usuario y 2 GB es memoria en modo kernel. Para software a gran escala, ocupará una gran cantidad de espacio de memoria durante la operación y es posible que no haya suficiente memoria virtual. Si la memoria virtual Si no es suficiente, se producirá una excepción de agotamiento de la memoria. Cuando hablamos antes de pérdidas de memoria, también hablamos de esta excepción de agotamiento de la memoria.
2) Las bibliotecas exe y dll con diferentes números de bits no se pueden mezclar.
       Los programas de 32 bits no pueden usar archivos dll de 64 bits y los programas de 64 bits no pueden usar archivos dll de 32 bits. Debido a que el número de bits es diferente, el rango de direcciones es diferente. Los programas de 32 bits deben utilizar archivos DLL de 32 bits y los programas de 64 bits deben utilizar archivos DLL de 64 bits. Por lo tanto, VLD proporciona dos versiones de la biblioteca, 32 bits y 64 bits. Los usuarios pueden elegir la versión correspondiente según la cantidad de bits en su propio programa.

4. Introducir VLD en el proyecto.

       Visual Leak Detector no es un programa ejecutable exe, a diferencia de las herramientas que se pueden ejecutar directamente, es una biblioteca dinámica dll que debe integrarse en nuestro código, recompilar el código y luego detectarlo mientras el programa se está ejecutando.

       Cuando nos referimos a VLD, al igual que al hacer referencia a una biblioteca dll normal, primero incluimos el archivo de encabezado de la biblioteca (vld.h), luego introducimos el archivo .lib de la biblioteca (vld.lib, necesario al compilar y vincular), y luego agregamos el dll Copie el archivo al directorio del programa principal exe.

1) Incluir el archivo de encabezado vld.h (para compilación)

       Antes de incluir el archivo de encabezado vld.h, debe establecer la ruta del archivo de encabezado vld.h en las propiedades del proyecto: C/C++ -> General, agregue la ruta del archivo de encabezado vld.h en el directorio de inclusión adicional. como se muestra a continuación:

De esta manera, al compilar el código, irá a la ruta anterior para encontrar el archivo de encabezado vld.h.

2) Introduce el archivo vld.lib (para vincular)

       Antes de introducir el archivo vld.lib, debe establecer la ruta donde se encuentra el archivo vld.lib en las propiedades del proyecto: Vinculador -> General, agregue la ruta donde se encuentra el archivo vld.lib en el directorio de biblioteca adicional, como sigue:

De esta manera, al compilar y vincular, el archivo vld.lib se encontrará en la ruta anterior y se vinculará. Aquí, no necesitamos introducir manualmente el archivo vld.lib en el código del proyecto, porque el archivo de encabezado vld.h se ha introducido automáticamente, como se muestra a continuación:

3) Copie el archivo de la biblioteca vld.dll al directorio principal del programa exe (para ejecutar)

      Vaya a la carpeta bin en el directorio de instalación y copie el dll y otros archivos al directorio del programa principal exe.

      Compile el código, ejecute el programa y vea los resultados de la detección.

5. Ejemplo de explicación de la detección de pérdidas de memoria

         Anteriormente creé un proyecto de consola win32 TestMemLeak y luego agregué una línea de código para solicitar memoria dinámicamente en la función principal, como se muestra a continuación:

Cuando sale la función principal, la memoria no se libera deliberadamente para probar el efecto de detección de VLD.

5.1 Error al iniciar el programa

       Como se mencionó anteriormente, establezca las rutas de los archivos de encabezado y los archivos .lib al proyecto y luego incluya el archivo de encabezado vld.h. Luego compila el código y comienza a depurar. Como resultado, se produce un error al iniciar y
aparece el siguiente cuadro emergente:

El programa no se puede iniciar y el código de excepción correspondiente es 0xc0150002.

        Para comprender el significado de este código de error, ingrese directamente la macro de código de error familiar en VS: STATUS_STACK_OVERFLOW
y luego vaya al archivo de encabezado definido por el código de excepción del sistema correspondiente, la ruta correspondiente es: C:\Program Files (x86) \ Microsoft SDKs\Windows\v7.0A\include\ntstatus.h
intentó buscar el código de excepción 0xc0150002 en el archivo de encabezado y lo encontró como se esperaba, de la siguiente manera:

El sistema no puede procesar información vinculante de la aplicación. ¿Es posible que al copiar archivos en el directorio bin, no solo se deba copiar vld_x86.dll, sino que también se deban copiar otros archivos en el directorio?
Así que copié dbghelp.dll y Microsoft.DTfW.DHL.manifest en el directorio bin al directorio del programa principal exe , y luego volví a ejecutar el programa exe y no se informaron más errores.

5.2. Inicie la depuración y vea el informe de pérdida de memoria

       Debido a que la función principal es relativamente simple, sale inmediatamente después de ingresar y el programa sale. Luego, en la ventana de salida de Visual Studio, vi: ¡Visual Leak Detector detectó pérdidas de memoria!, es decir, VLD detectó una pérdida de memoria, como se muestra a continuación:

Imprimió la dirección y el tamaño de la pérdida de memoria:

---------- Bloque 1 en 0x01497020: 1024 bytes ----------

Al mismo tiempo, también se imprime la pila de llamadas de función del hilo donde se encuentra el código filtrado y luego se muestra el contenido de la memoria donde se filtró la memoria. Haga doble clic en la línea de código en la imagen para saltar a la línea de código donde ocurre la pérdida de memoria:

5.3 Uso del archivo de configuración vld.ini

      También hay un archivo de configuración vld.ini en el directorio de instalación de VLD, como se muestra a continuación:

Algunas configuraciones de VLD se pueden realizar en este archivo de configuración. Si desea utilizar este archivo, debe copiarlo al directorio del programa principal exe.

       Puede utilizar el elemento de configuración ReportTo. De forma predeterminada, el informe de análisis se envía a la ventana del Depurador, como se muestra a continuación:

Se puede configurar en ambos, de modo que pueda enviarse a la ventana del depurador o que el informe de detección pueda enviarse a un archivo. Si la opción ReportTo está configurada en ambas, la opción ReportFile también debe configurarse para especificar el nombre del archivo al que se exportará, como por ejemplo:

Hay otras opciones de configuración y hay anotaciones detalladas en el archivo. Si está interesado, puede probarlas usted mismo.

6. Finalmente

       También puede utilizar el programa umdh en Windbg para detectar pérdidas de memoria, lo hemos utilizado en nuestros proyectos y el efecto es bueno. Para conocer el proceso detallado de usar umdh para detectar pérdidas de memoria, consulte el artículo que escribí antes:
Uso de Windbg para localizar pérdidas de memoria en programas Windows C ++ icono-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/121295720 Al usar Análisis umdh, no es necesario. Es más conveniente volver a compilar el código. Cuando utilice VLD, deberá volver a compilar el código, lo que será más problemático. Especialmente para el software a gran escala, el software contiene múltiples módulos dll. Diferentes grupos de desarrollo mantienen diferentes módulos dll. No es fácil recompilar todos los módulos con VLD, lo que requiere coordinación general y no es una tarea fácil.

       Además, estas herramientas de detección de fugas de memoria no son omnipotentes y no pueden detectar fugas en todos los escenarios. Debido a que el software a gran escala contiene múltiples módulos, el código es engorroso y complicado: algunos módulos solicitarán memoria tan pronto como se inicien y nunca se publicarán, algunos pueden usar un grupo de memoria y la administración de la memoria es más complicada. Esto dará lugar a una detección falsa por parte de la herramienta. Es necesario analizar si se trata de un punto de pérdida de memoria real en función del código y el negocio específicos. Si una herramienta no puede detectarla, debe probar otras herramientas, o incluso muchas herramientas.

       En cuanto a las herramientas para analizar pérdidas de memoria, hace unos años existía una poderosa herramienta llamada BoundsChecker, pero esta herramienta no se ha mantenido durante mucho tiempo y la nueva versión de Visual Studio ya no se puede utilizar. Además, Visual Studio 2019 V19.6 ha introducido la herramienta de análisis de memoria de Google AddressSanitizer:

Pruebe también AddressSanitizer. Para saber cómo utilizar la herramienta de análisis de memoria AddressSanitizer en VS, puede leer las instrucciones detalladas en el artículo oficial de Microsoft:

Uso de AddressSanitizer en Visual Studio icono-default.png?t=N7T8https://docs.microsoft.com/zh-cn/cpp/sanitizers/asan?view=msvc-170        Para usar AddressSanitizer integrado en Visual Studio, debe actualizar el IDE a Visual Studio 2019 V19. 6 o superior, se necesita cierta cantidad de tiempo y mano de obra para actualizar varios módulos de un software grande de arriba a abajo a una versión determinada.

Supongo que te gusta

Origin blog.csdn.net/chenlycly/article/details/133041372
Recomendado
Clasificación