Изучение статистики памяти кучи C / C ++ в GDB - PullRequest
26 голосов
/ 02 апреля 2010

Я пытаюсь исследовать состояние кучи C / C ++ изнутри gdb в Linux amd64, есть ли хороший способ сделать это?

Один из подходов, которые я попробовал, - это "вызвать mallinfo ()", но, к сожалению, я не могу тогда извлечь нужные значения, так как GDB неправильно обрабатывает возвращаемое значение.

Мне нелегко написать функцию для компиляции в двоичный файл для процесса, к которому я присоединен, поэтому я могу просто реализовать свою собственную функцию для извлечения значений, вызывая mallinfo () в моем собственном коде таким образом , Может быть, есть хитрый трюк, который позволит мне делать это на лету?

Другим вариантом может быть нахождение кучи и просмотр списка заголовков / свободных адресов malloc; Я был бы признателен за любые указания, где я мог бы начать находить их расположение и расположение.

Я пытался найти в Google и обдумать проблему около 2 часов, и я изучил некоторые интересные вещи, но все еще не нашел то, что мне нужно.

Ответы [ 2 ]

26 голосов
/ 07 апреля 2010

@ fd - ошибка RedHat получила ваш ответ.

Функция mallinfo устарела и не будет обновляться. Истинный API статистики запросов - это TDB. Сегодня у вас есть malloc_stats и malloc_info. Я не могу найти никаких документов ни по одному, но вот что они вам дают.

Это достаточно близко к тому, что вам нужно?

(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>
3 голосов
/ 03 апреля 2010

Если вы можете изменить код:

#include <malloc.h>
#include <stdio.h>

void dumpMallinfo(void) {
  struct mallinfo m = mallinfo();
  printf("uordblks = %d\nfordblks = %d\n", m.uordblks, m.fordblks);
}

В GDB вы можете call dumpMallinfo().

...