Подтвердить что ты не робот

Изучение статистики памяти кучи C/С++ в gdb

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

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

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

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

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

4b9b3361

Ответ 1

@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>

Ответ 2

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

#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().