Методы класса C++ не имеют диапазона адресов в информации DWARF.

Я пытаюсь проанализировать отладочную информацию DWARF, чтобы определить функции по адресу трассировки стека. Если это работает для моих функций C (скомпилированных с помощью gcc), это не работает для моих функций C++ (скомпилированных с помощью g++)

Все мои функции C имеют в таблице .debug_info атрибуты DW_AT_low_pc и DW_AT_low_high, которые говорят мне, в каком диапазоне памяти находится эта функция, например.

<1><17433>: Abbrev Number: 33 (DW_TAG_subprogram)
    <17434>   DW_AT_external    : 1
    <17434>   DW_AT_name        : (indirect string, offset: 0x4704): TLSCursor_init
    <17438>   DW_AT_decl_file   : 1
    <17439>   DW_AT_decl_line   : 46
    <1743a>   DW_AT_linkage_name: (indirect string, offset: 0x4536): _Z14TLSCursor_initP9TLSCursorP13TCPConnection
    <1743e>   DW_AT_low_pc      : 0x1178ce
    <17442>   DW_AT_high_pc     : 0x1b
    <17446>   DW_AT_frame_base  : 1 byte block: 9c  (DW_OP_call_frame_cfa)
    <17448>   DW_AT_GNU_all_call_sites: 1
    <17448>   DW_AT_sibling     : <0x17469>`

Most of my C++ methods, however most do NOT have such attributes:

`<2><144de>: Abbrev Number: 7 (DW_TAG_subprogram)
    <144df>   DW_AT_external    : 1
    <144df>   DW_AT_name        : (indirect string, offset: 0x3505): ~TLSNumber
    <144e3>   DW_AT_decl_file   : 3
    <144e4>   DW_AT_decl_line   : 23
    <144e5>   DW_AT_linkage_name: (indirect string, offset: 0x3510): _ZN9TLSNumberD4Ev
    <144e9>   DW_AT_accessibility: 1    (public)
    <144ea>   DW_AT_declaration : 1
    <144ea>   DW_AT_object_pointer: <0x144f2>
    <144ee>   DW_AT_sibling     : <0x144fd>

Есть ли для этого причина? Как я могу определить диапазон адресов функции в этом случае?


person user7094    schedule 13.06.2016    source источник


Ответы (1)


Определения метода DWARF можно разделить на «абстрактную» и «конкретную» части. Например, его можно использовать, когда у вас есть функция, встроенная в несколько мест. Вся pc-инвариантная информация хранится в абстрактной записи, в то время как конкретные записи будут иметь указатель на абстрактную запись и добавлять значения pc для этого конкретного экземпляра метода.

Просмотрите информацию о дварфах, чтобы найти другое DW_AT_abstract_origin, которое указывает на это.

Кроме того, на кристалле этой подпрограммы есть тег DW_AT_declaration, который говорит вам, что это объявление (например, из файла заголовка), а не обязательно определение. Я могу ошибаться в том, что это абстрактная/конкретная пара, возможно, эта информация дублируется в штампе объявления позже в карлике.

person Jason Molenda    schedule 13.06.2016
comment
Я действительно нашел другие DIE, указывающие на первый DIE через свое поле DW_AT_specification. - person user7094; 14.06.2016