mtrace(3) Library Functions Manual mtrace(3)

mtrace, muntrace - urmărire malloc

Biblioteca C standard (libc, -lc)

#include <mcheck.h>
void mtrace(void);
void muntrace(void);

Funcția mtrace() instalează funcții cârlig pentru funcțiile de alocare a memoriei (malloc(3), realloc(3) memalign(3), free(3)). Aceste funcții cârlig înregistrează informații de urmărire despre alocarea și eliberarea memoriei. Informațiile de urmărire pot fi utilizate pentru a descoperi scurgerile de memorie și încercările de a elibera memoria nealocată într-un program.

Funcția muntrace() dezactivează funcțiile cârlig instalate de mtrace(), astfel încât informațiile de urmărire nu mai sunt înregistrate pentru funcțiile de alocare a memoriei. În cazul în care nicio funcție de cârlig nu a fost instalată cu succes de mtrace(), muntrace() nu face nimic.

Atunci când este apelată mtrace(), aceasta verifică valoarea variabilei de mediu MALLOC_TRACE, care ar trebui să conțină numele rutei unui fișier în care urmează să fie înregistrate informațiile de urmărire. În cazul în care numele rutei este deschis cu succes, acesta este trunchiat la lungimea zero.

Dacă MALLOC_TRACE nu este configurat sau dacă numele de rută pe care îl specifică nu este valid sau nu poate fi scris, atunci nu sunt instalate funcții de cârlig, iar mtrace() nu are niciun efect. În programele set-user-ID și set-group-ID, MALLOC_TRACE este ignorat, iar mtrace() nu are niciun efect.

Pentru o explicație a termenilor folosiți în această secțiune, a se vedea attributes(7).

Interfață Atribut Valoare
mtrace(), muntrace() Siguranța firelor MT-Unsafe

GNU.

În mod normal, mtrace() este apelată o dată la începutul execuției unui program, iar muntrace() nu este apelată niciodată.

Rezultatul de urmărire produs în urma unui apel la mtrace() este textual, dar nu este conceput pentru a fi citit de oameni. Biblioteca GNU C oferă un script Perl, mtrace(1), care interpretează jurnalul de urmărire și produce o ieșire care poate fi citită de oameni. Pentru cele mai bune rezultate, programul urmărit trebuie compilat cu depanarea activată, astfel încât informațiile privind numerele de linie să fie înregistrate în executabil.

Urmărirea efectuată de mtrace() implică o penalizare de performanță (dacă MALLOC_TRACE indică un nume de rută valid și inscriptibil).

Informația privind numărul de linie produsă de mtrace(1) nu este întotdeauna precisă: referințele la numărul de linie se pot referi la linia anterioară sau următoare (fără spații libere) din codul sursă.

Sesiunea shell de mai jos demonstrează utilizarea funcției mtrace() și a comenzii mtrace(1) într-un program care are pierderi de memorie în două locații diferite. Demonstrația utilizează următorul program:


$ cat t_mtrace.c

#include <mcheck.h>
#include <stdio.h>
#include <stdlib.h>
int
main(void)
{
    mtrace();
    for (unsigned int j = 0; j < 2; j++)
        malloc(100);            /* Nu a fost eliberată niciodată - o scurgere de memorie */
    calloc(16, 16);             /* Nu a fost eliberată niciodată - o scurgere de memorie */
    exit(EXIT_SUCCESS);
}

Când rulăm programul după cum urmează, observăm că mtrace() a diagnosticat pierderi de memorie în două locații diferite din program:


$ cc -g t_mtrace.c -o t_mtrace
$ export MALLOC_TRACE=/tmp/t
$ ./t_mtrace
$ mtrace ./t_mtrace $MALLOC_TRACE
Memorie neeliberată:
-----------------
    Adresa   Dimens     Apelant
0x084c9378     0x64  la /home/cecilia/t_mtrace.c:12
0x084c93e0     0x64  la /home/cecilia/t_mtrace.c:12
0x084c9448    0x100  la /home/cecilia/t_mtrace.c:16

Primele două mesaje despre memoria neliberată corespund celor două apeluri malloc(3) din interiorul buclei for. Ultimul mesaj corespunde apelului la calloc(3) (care, la rândul său, apelează malloc(3)).

mtrace(1), malloc(3), malloc_hook(3), mcheck(3)

Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>

Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.

Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.

31 octombrie 2023 Pagini de manual de Linux 6.06