Red de conocimiento informático - Conocimiento informático - Cómo comprobar si hay pérdidas de memoria en Linux integrado

Cómo comprobar si hay pérdidas de memoria en Linux integrado

1. Llame a void mtrace(void) al comienzo del código que necesita verificar si hay pérdidas de memoria (un enlace para funciones (como malloc) que registra la información de asignación de memoria está instalado en mcheck.h?mtrace. final del código que necesita verificar si hay pérdidas de memoria.

Nota: En general, no llame a muntrace y deje que el programa finalice naturalmente. Esto se debe a que es posible que parte del código que libera memoria no. ejecutar hasta después de muntrace. p> 2. Compile el código verificado en modo de depuración (-g o -ggdb)

3. Establezca la variable de entorno MALLOC_TRACE en el nombre del archivo donde se guarda la información de asignación de memoria.

4. Ejecute el programa que se está verificando hasta que finalice o se llame a muntrace

5. Analice el archivo de registro de asignación de memoria ($MALLOC_TRACE)

(mtrace foo $MALLOC_TRACE, donde foo es el nombre del archivo ejecutable)

Si hay una pérdida de memoria, mtrace generará la asignación de memoria.

Si hay una pérdida de memoria, mtrace lo hará. genera la ubicación del código donde se asignó la memoria

Y cuánta memoria está asignada

Notas adicionales

1. mtrace, muntrace se puede colocar en procesadores de señal. (USR1, USR2) para controlar dinámicamente la verificación de fugas de memoria

2. mtrace es un fragmento de código Perl. Si está interesado en convertir direcciones simbólicas en texto de código, léalo

3. Nuevamente, intente no usar mtrace()

Para fugas de C:

La verificación de pérdidas de memoria no solo la proporciona glibc, también puede probar algunos programas especializados.

Curiosamente, redhat 9 no viene con el script mtrace perl, así que tuve que descargar el código fuente de gcc y compilarlo

wget --passive-ftp ftp://rpmfind net/linux/redhat/9 ... -2.3.2-11.9.src.rpm

rpm -ivh glibc*.src.rpm

cd /usr/src/. redhat /SPECS/

rpmbuild -ba glibc-9.spec

cd /var/tmp/ glibc-2.3.2-root/usr/bin/

cp mtrace /usr/bin/

El método de depuración es el siguiente:

vi a.c

1 #include

2

3 int main()

4 {

5 mtrace();

6 malloc(10);

7 malloc; (16);

8 return 0;

9 }

$gcc -g a.c #Recuerda compilar con la opción de depuración -g

$export MALLOC_TRACE = a.log

$./a.out

$unset MALLOC_TRACE #Recuerde desarmar la variable después de la ejecución; de lo contrario, se pueden ejecutar otros comandos para sobrescribir el registro

$mtrace a.out a.

Memoria no publicada:

-------------- ---

Tamaño de dirección de la persona que llama

0x09b08378 0xa en /XXX/a.c: 6

0x09b08388 0x10 en /XXX/a.c: 7

As puedes ver, no Se muestra la ubicación exacta del código que libera espacio dinámico.