Mtrace - Mtrace
![]() | tento článek obsahuje pokyny, rady nebo návody k obsahu.Březen 2015) ( |
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ázdnotamtrace
(prázdnota
);
prázdnotamuntrace
(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í
- 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
- 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>
- Zavolejte funkci
mtrace ()
než začnete přidělovat paměť. Obvykle je nejjednodušší volatmtrace ()
na samém začátkuhlavní()
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 koncihlavní()
funkce: muntrace();
- 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
- 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 konzolymtrace
, 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. Themtrace
syntaxe je následující:$ mtrace
- Například:
$ mtrace a.out MallocTraceOutputFile.txt
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 * /}