DWARF 디버그 정보를 구문 분석하여 스택 추적 주소에서 함수를 확인하려고합니다. 이 (GCC로 컴파일) 내 C의 기능을 작동하면, (g 컴파일 ++) C++ 클래스 메서드는 DWARF 정보에 주소 범위가 없습니다
내 C의 기능을 모두
말해 a를.debug_info
테이블의
DW_AT_low_pc
과
DW_AT_low_high
속성이 내 C++ 기능하지 않는 것 메모리 범위이 함수는 예를 들어
<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>
어떤 이유가 있습니까? 이 경우 함수의 주소 범위를 어떻게 결정합니까?
실제로 나는 다른 DIE가 'DW_AT_specification'필드를 통해 첫 번째 DIE를 가리키는 것을 발견했습니다. – user7094