формат нумерации тегов с ++

Рассмотрим следующий пример кода дварфа —

<0><b>: Abbrev Number: 1 (DW_TAG_compile_unit)
<c>   DW_AT_producer    : (indirect string, offset: 0xd): GNU C++ 4.3.0 20080428 (Red Hat 4.3.0-8)
<10>   DW_AT_language    : 4    (C++)
<11>   DW_AT_name        : (indirect string, offset: 0x75): test.cpp
<15>   DW_AT_comp_dir    : (indirect string, offset: 0x4d): /home/dwarf
<19>   DW_AT_low_pc      : 0x0
<21>   DW_AT_high_pc     : 0xb
<29>   DW_AT_stmt_list   : 0x0
<1><2d>: Abbrev Number: 2 (DW_TAG_class_type)
<2e>   DW_AT_name        : C
<30>   DW_AT_byte_size   : 8
<31>   DW_AT_decl_file   : 1
<32>   DW_AT_decl_line   : 1
<33>   DW_AT_sibling     : <0x86>
<2><37>: Abbrev Number: 3 (DW_TAG_member)
<38>   DW_AT_name        : x
<3a>   DW_AT_decl_file   : 1
<3b>   DW_AT_decl_line   : 7
<3c>   DW_AT_type        : <0x86>
<40>   DW_AT_data_member_location: 2 byte block: 23 0   (DW_OP_plus_uconst: 0)
<43>   DW_AT_accessibility: 3   (private)
<2><44>: Abbrev Number: 3 (DW_TAG_member)
<45>   DW_AT_name        : y
<47>   DW_AT_decl_file   : 1
<48>   DW_AT_decl_line   : 8
<49>   DW_AT_type        : <0x86>
<4d>   DW_AT_data_member_location: 2 byte block: 23 4   (DW_OP_plus_uconst: 4)
<50>   DW_AT_accessibility: 3   (private)

Я работал над программой, которая анализирует карликовые файлы, и я не уверен в одной ее части. Если вы заметили, у каждого тега есть дополнительный номер слева от него (в этом примере есть <0> <1> и <2>). Я не совсем уверен, что это такое. Я думаю, что это какой-то уровень стека или что-то, так как <0> дается программе в целом, <1> присваивается классу высшего уровня, и <2> дается его переменным-членам. Тем не менее, я не смог найти что-либо об этом в документация. Для справки вот оригинальная программа —

class C {
public:
C();
C(int x, int y);
int getX();
private:
int x;
int y;
};

class SubC : public C {
int z;
};

int f() {return 0;}

C c;
SubC subC;

int i;
double d;

0

Решение

DWARF DIEs организованы в виде дерева — верхний уровень DW_TAG_compile_unit для одного файла будет содержать все определения типов (DW_TAG_class_type например), все функции (DW_TAG_subprogram) и глобальные / статические переменные (DW_TAG_variable). Определение класса (DW_TAG_class_type) будет DIE родителей и содержать таких детей, как DW_TAG_member для переменных-членов или DW_TAG_subprogram для методов.

Вывод, который вы добавили, — это способ работы вашего конкретного DWARF-дампера — похоже, он использует это число, чтобы показать отношения родитель / потомок. Это readelf? Другие программы Dwarf Dumper могут показать это по-другому. В Mac OS X dwarfdump показывает эту связь с отступом — дети DIE имеют отступ немного больше, чем родительские DIE.

Если вы смотрите на спецификации DWARF на http://dwarfstd.org/ вы ничего не найдете об этом числе в стандарте — но если вы напишите подлинный парсер DWARF (в отличие от парсера, который интерпретирует вывод readelf или что-то еще), вы увидите эту тему, освещенную в разделе 2.3 («Отношения записей отладочной информации») и в разделе 7.5.3 «Таблицы сокращений» (DW_CHILDREN_yes или же DW_CHILDREN_no) в спецификации DWARF4

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]