Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Examining C/C++ Heap memory statistics in gdb

I'm trying to investigate the state of the C/C++ heap from within gdb on Linux amd64, is there a nice way to do this?

One approach I've tried is to "call mallinfo()" but unfortunately I can't then extract the values I want since gdb doesn't deal with the return value properly.

I'm not easily able to write a function to be compiled into the binary for the process I am attached to, so I can simply implement my own function to extract the values by calling mallinfo() in my own code this way. Is there perhaps a clever trick that will allow me to do this on-the-fly?

Another option could be to locate the heap and traverse the malloc headers / free list; I'd appreciate any pointers to where I could start in finding the location and layout of these.

I've been trying to Google and read around the problem for about 2 hours and I've learnt some fascinating stuff but still not found what I need.

like image 691
Mike Tunnicliffe Avatar asked Apr 02 '10 02:04

Mike Tunnicliffe


1 Answers

@fd - the RedHat bug had your answer.

The mallinfo function has been deprecated, and won't be updated. A true query stats API is TDB. Today, you have malloc_stats and malloc_info. I can't find any documentation on either one, but here's what they give you.

Is this close enough to what you need?

(gdb) call malloc_stats() Arena 0: system bytes     =     135168 in use bytes     =         96 Total (incl. mmap): system bytes     =     135168 in use bytes     =         96 max mmap regions =          0 max mmap bytes   =          0  (gdb) call malloc_info(0, stdout) <malloc version="1"> <heap nr="0"> <sizes> <unsorted from="1228788" to="1229476" total="3917678" count="3221220448"/> </sizes> <total type="fast" count="0" size="0"/> <total type="rest" count="3221220448" size="3917678"/> <system type="current" size="135168"/> <system type="max" size="135168"/> <aspace type="total" size="135168"/> <aspace type="mprotect" size="135168"/> </heap> <total type="fast" count="0" size="0"/> <total type="rest" count="3221220448" size="3917678"/> <system type="current" size="135168 /> <system type="max" size="135168 /> <aspace type="total" size="135168"/> <aspace type="mprotect" size="135168"/> </malloc> 
like image 64
leedm777 Avatar answered Sep 28 '22 08:09

leedm777