Cómo comprobar si hay pérdidas de memoria en Linux integrado
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
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.