2014-09-30 5 views
0

У меня есть Linux CPP скомпилированный двоичный файл. На основе имени класса (символа), как я могу узнать размер символа во время выполнения, память, которую он будет занимать; С помощью любого инструмента разборки? Или любые другие методы?Знать размер класса во время выполнения

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

+0

Вы имеете в виду размер объекта, который был создан после создания, или пространство, которое занимает ваша реализация класса (код)? Это два совершенно разных вопроса. –

+1

Попробуйте 'sizeof (myclass)'? –

+0

@Mats Petersson: Объект, созданный однажды, занимает – Jailbroken

ответ

3

Бинарные файлы необходимо скомпоновать с помощью отладочных символов, чтобы найти эту информацию. Вы можете прочитать информацию из символов отладки DWARF. Вот демонстрация:

Учитывая этот код:

#include <iostream> 
struct MyType { 
    int a, b,c; 
    float d; 
}; 


int main(int argc, char *argv[]) 
{ 
    struct MyType t; 
    std::cout << sizeof(t); 

} 

Вы можете скомпилировать его с g++ -g demo.c

дамп отладочные символы с

objdump -W ./a.out 

Там будет раздел, как

<1><13c7>: Abbrev Number: 20 (DW_TAG_structure_type) 
    <13c8> DW_AT_name  : (indirect string, offset: 0x8af): MyType 
    <13cc> DW_AT_byte_size : 16 
    <13cd> DW_AT_decl_file : 1 
    <13ce> DW_AT_decl_line : 2 
    <13cf> DW_AT_sibling  : <0x13fc> 

Там мы идем, MyType имеет размер 16.

Если у двоичного файла нет отладочных символов, вам не повезло. Вам нужно знать место, где код имеет дело с размером типа, который вас интересует, разобрать двоичный код, найти ту часть кода.

Смежные вопросы