Myslím, že mallinfo() je to, co chcete:
#include <malloc.h>
struct mallinfo *info;
info = mallinfo();
printf ("total allocated space: %llu bytes\n", info->uordblks);
printf ("total free space: %llu bytes\n", info->fordblks);
Struktura struct mallinfo je technická a specifická pro implementaci malloc(). Ale informace, které chcete, tam jsou. Hodnoty hlásím takto:
mallinfo.arena = "Total Size (bytes)"
mallinfo.uordblks = "Busy size (bytes)"
mallinfo.fordblks = "Free size (bytes)"
mallinfo.ordblks = "Free blocks (count)"
mallinfo.keepcost = "Top block size (bytes)"
mallinfo.hblks = "Blocks mapped via mmap() (count)"
mallinfo.hblkhd = "Bytes mapped via mmap() (bytes)"
Tyto dva se údajně nepoužívají, ale zdá se, že se v mém systému mění, a proto by mohly být platné:
mallinfo.smblks = "Fast bin blocks (count)"
mallinfo.fsmblks = "Fast bin bytes (bytes)"
A další zajímavá hodnota je vrácena "sbrk (0)"
Existuje řada možností.
Jak přesné to potřebuješ? Některá užitečná data můžete získat pomocí cat /proc/${PID}/status | grep VmData .
Můžete #definovat svůj vlastní malloc() , realloc() , calloc() a free() funkce, zabalit skutečné funkce za svůj vlastní pult. Zde můžete dělat opravdu skvělé věci s __FILE__, __LINE__ a __func__ pro usnadnění identifikace netěsností jádra v jednoduchých testech. Ale bude instrumentovat pouze váš vlastní kód!
(Podobně můžete také předefinovat výchozí operátor nový a smazání operátorem metody, jak pole, tak varianty bez pole, a obě varianty std::bad_alloc a std::nothrow_t. Opět, toto bude instrumentovat pouze váš vlastní kód!)
(Uvědomte si:Na většině systémů C++ nové nakonec vyvolá malloc() . Nemusí. Zejména u nových na místě ! Ale obvykle nové používá malloc() . (Nebo funguje na oblasti paměti, která byla dříve malloc()'ed .) Jinak byste se dostali do opravdu funky věcí s několika správci haldy...)
Můžete použít sbrk(0) abyste viděli, kde je datový segment aktuálně nastaven. To není tak skvělé. Je to velmi hrubé měření a nebere v úvahu díry (nevyužité oblasti paměti) v haldě. (Mnohem lépe jste na tom s VmData řádek z /proc/${PID}/status .) Ale pokud hledáte jen obecný nápad...
Můžete zachytit malloc()/free()/etc napsáním vlastní sdílené knihovny a vynucením vašeho procesu, aby ji používal místo skutečných verzí prostřednictvím LD_PRELOAD . Můžete použít dlopen()/dlsym() k načtení a vyvolání *skutečného* malloc()/free()/etc . Tohle funguje docela krásně. Původní kód je nezměněn, dokonce ani překompilován. Při kódování této knihovny si však uvědomte, že se znovu objeví situace a že váš proces zpočátku vyvolá malloc()/calloc()/realloc() před dlopen()/dlsym() může dokončit načítání skutečných funkcí.
Můžete vyzkoušet nástroje jako Valgrind , ačkoli to je ve skutečnosti zaměřeno spíše na úniky paměti.
Pak znovu možná mtrace() je to, co chceš? Nebo __malloc_hook ? Velmi proprietární (GNU) a nestandardní... Ale jste označeni jako "Linux"...
Není to snadné, automatické způsob, jak to udělat, pokud se na to ptáte. V podstatě musíte ručně sledovat alokace haldy sami pomocí proměnné čítače. Problém je v tom, že je obtížné kontrolovat, které části vašeho programu alokují paměť na hromadě, zvláště pokud používáte mnoho knihoven, které nemáte pod kontrolou. Aby se to ještě více zkomplikovalo, existují dva způsoby, jak může program alokovat paměť haldy:new
nebo malloc
. (Nemluvě o přímých voláních OS jako sbrk
.)
Globální operátor new
můžete přepsat a mít každou výzvu k novému zvýšení globálního počtu. To však nemusí nutně zahrnovat časy, kdy váš program volá malloc
, nebo když váš program používá nějaký new
specifický pro třídu přepsat. Můžete také přepsat malloc
pomocí makra, ale to nemusí být nutně přenosné. A také byste museli přepsat všechny varianty malloc
, například realloc
, calloc
, atd. To vše je dále komplikováno skutečností, že u některých implementací new
sám může volat malloc
.
Takže v podstatě je velmi obtížné to udělat správně z vašeho programu. Místo toho bych doporučil použít nástroj pro profilování paměti.