Как узнать адрес конца кучи? - PullRequest
0 голосов
/ 21 января 2011

Спасибо за ответы и ответы. Этот вопрос был отредактирован, потому что кажется, что все мои предыдущие вопросы были очень размытыми и не дают точных деталей того, чего я хочу достичь, и моей цели.

Обновленный вопрос:

Используя язык C на платформе Linux, какие возможные способы определения размера кучи используются в моем приложении. Как например ..

void printHeapReport( )
{
   /* implementation here to print the heap size */
}

int main()
{
    char *ptemp = NULL;
    p = (char*)malloc( 10 ); /* 10 bytes */

    printHeapReport();

    return 0;
}

Приложение выведет на стандартный экран вывода:

Debug Report:  
--------------  
Heap: 10 bytes  
--------------  

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

Пожалуйста, совет.

Большое спасибо.


Старый вопрос:

Используя встроенную функцию C asm, возможно ли узнать адрес начала кучи и конца кучи? Также адрес конца программы?

asm( <assembly code> );

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

Пожалуйста, совет.

Большое спасибо.

Ответы [ 3 ]

4 голосов
/ 21 января 2011

Вы должны были бы по крайней мере указать, с какой платформой вы имеете дело, и понять, что на многих платформах вопрос на самом деле не имеет ответа. «Куча» не обязательно должна быть смежной - во многих случаях будет несколько кучи для разных типов объектов (например, для запросов определенного размера), и среда выполнения может получать блоки для «кучи» по мере необходимости из базовой ОС .

Аналогично для «программы» - различные части исполняемого файла могут быть перемежены данными или областями адресного пространства, в которых нет ничего.

3 голосов
/ 21 января 2011

Сборка совершенно бесполезна для этого. Если реализация стандартной библиотеки вашей системы предоставляет переменную, которая хранит адрес вершины кучи, вы можете получить к ней доступ так же легко, без asm. В противном случае вы можете получить доступ и обрабатывать данные процесса, относящиеся к ОС, например (в Linux) /proc/self/smaps, чтобы определить адресную схему вашей программы. Но независимо от этого asm вам не поможет .

2 голосов
/ 21 января 2011

Если ваша стандартная библиотека glibc (скорее всего), то вы можете #include <malloc.h> и позвонить malloc_stats();, чтобы напечатать отчет о куче в stderr.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...