Mtrace - Mtrace

mtrace je debugger paměti zahrnuto v Knihovna GNU C..

Použití

Všimněte si, že mtrace nástroj funguje pouze s aplikacemi s jedním závitem. Jedno vlákno by mohlo dočasně odstranit háček, zatímco jiné vlákno by mohlo malloc paměti současně, což by vedlo ke zmeškanému přidělení v aplikaci s více vlákny!

Funkce mtrace nainstaluje obslužné programy pro malloc, realloc a volný, uvolnit; funkce muntrace zakáže tyto obslužné rutiny. Jejich prototypy, definované v hlavičkovém souboru mcheck.h, jsou

prázdnota mtrace(prázdnota);
prázdnota muntrace(prázdnota);

Obslužné rutiny zaznamenávají všechna přidělení paměti a uvolňují do souboru definovaného pomocí proměnná prostředí MALLOC_TRACE (pokud není proměnná nastavena, popisuje neplatný název souboru nebo popisuje název souboru, ke kterému uživatel nemá oprávnění, obslužné programy nejsou nainstalovány).

A perl skript volal mtrace, aby nedošlo k záměně s funkcí stejného jména, je také distribuován s knihovnou GNU C; skript provede analýzu výstupního souboru a ohlásí všechna přidělení, která nebyla uvolněna.

Příklad použití

Špatný zdrojový kód

Následuje příklad chybného zdrojového kódu. Problém s programem spočívá v tom, že přiděluje paměť, ale neuvolňuje paměť před ukončením.

#zahrnout <stdlib.h>int hlavní(prázdnota) {	int * A;	A = malloc(velikost(int)); / * přidělit paměť a přiřadit ji ukazateli * /		vrátit se 0; / * program jsme ukončili bez uvolnění paměti * /	/ * měli jsme uvolnit přidělenou paměť s příkazem „free (a)“ * /}

MTrace použití

  1. Nastavte proměnnou prostředí MALLOC_TRACE na cestu požadovaného výstupního souboru. Nastavení proměnných prostředí se v každém prostředí mírně liší. v Bourne Shell -kompatibilní skořápky, jako Bash, příkaz je následující:
    $ MALLOC_TRACE=/home/YourUserName/path/to/program/MallocTraceOutputFile.txt$ vývozní MALLOC_TRACE
  2. Zahrnout mcheck.h ve zdrojovém kódu. To se děje například přidáním následujícího řádku do horní části a C nebo C ++ soubor, jak je uvedeno níže:
    #zahrnout <mcheck.h>
  3. Zavolejte funkci mtrace () než začnete přidělovat paměť. Obvykle je nejjednodušší volat mtrace () na samém začátku hlavní() funkce:
    mtrace();
    Chcete-li vymezit konec kódu, který by měl být vysledován, zavolejte funkci muntrace (). To se obvykle provádí na konci hlavní() funkce:
    muntrace();
  4. Zkompilujte a spusťte program jako obvykle. Všimněte si, že musíte kompilovat s -G možnost získat užitečný výstup. V GCC v Linuxu to lze provést pomocí následujících příkazů pro a C program:
    $ gcc yourProgram.c -g$ ./a.out
  5. Informace o úniku paměti budou hlášeny v souboru určeném MALLOC_TRACE proměnná prostředí. Potíž je v tom, že tento soubor bude v počítačově čitelném formátu. Většina strojů Linux je vybavena příkazem konzoly mtrace, který převádí počítačově čitelný formát na text čitelný člověkem, jak je uvedeno níže. Pokud nemáte přístup k tomuto příkazu konzoly, existuje Perl skript se stejným názvem, který lze stáhnout za účelem provedení stejného úkolu. The mtrace syntaxe je následující:
    $ mtrace  
    Například:
    $ mtrace a.out MallocTraceOutputFile.txt
  6. mtrace lze použít s paralelním výpočtem, ale pouze s jedním procesem, s použitím podmínky v pořadí jako:
    -li (my_rank==0) mtrace();

Výstup MTrace

Pokud příkaz mtrace hlásí „Žádné úniky paměti“, byla uvolněna také veškerá paměť přidělená při posledním spuštění tohoto programu, což by mělo být. Pokud na druhou stranu mtrace poskytuje výstup, jako je ten níže, znamená to, že programátor má ještě nějakou práci.

Paměť není uvolněna: ----------------- Adresa Velikost Volajícího 0x08049910 0x4 na /home/sureshsathiah/tips/leak.c:9

Dobrý zdrojový kód

Následuje příklad dobrého zdrojového kódu. Po přidělení uvolní paměť a pomocí programu mtrace upozorní programátora, pokud dojde k úniku paměti.

#zahrnout <stdlib.h>#zahrnout <mcheck.h>int hlavní(prázdnota) {	mtrace(); / * Zahájí záznam přidělení a vydání paměti * /	int* A = NULA;	A = malloc(velikost(int)); / * přidělit paměť a přiřadit ji ukazateli * /	-li (A == NULA) {		vrátit se 1; / * chyba * /	}	volný, uvolnit(A); / * uvolňujeme paměť, kterou jsme přidělili, abychom neměli úniky * /	muntrace();	vrátit se 0; / * výstup * /}

Viz také

externí odkazy