2016-06-13 2 views
1

DWARF 디버그 정보를 구문 분석하여 스택 추적 주소에서 함수를 확인하려고합니다. 이 (GCC로 컴파일) 내 C의 기능을 작동하면, (g 컴파일 ++) C++ 클래스 메서드는 DWARF 정보에 주소 범위가 없습니다

내 C의 기능을 모두

말해 a를 .debug_info 테이블의 DW_AT_low_pcDW_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> 

어떤 이유가 있습니까? 이 경우 함수의 주소 범위를 어떻게 결정합니까?

답변

2

DWARF 메서드 정의는 "추상"및 "콘크리트"부분으로 나눌 수 있습니다. 예를 들어 여러 위치에 인라인 된 함수가있을 때이 함수를 사용할 수 있습니다. 모든 PC 불변 정보는 추상 엔트리에 저장되는 반면, 구체적인 엔트리는 추상 엔트리에 대한 포인터를 가지며 메소드의이 특정 인스턴스에 대한 pc 값을 추가합니다.

드워프 정보를 통해 다른 DW_AT_abstract_origin을 찾아보십시오.

또한이 서브 프로그램 다이에 DW_AT_declaration 태그가 있습니다.이 태그는 헤더 파일과 같은 선언이며 반드시 정의가 아니라는 것을 알려줍니다. 이것이 추상/콘크리트 쌍이라는 것이 잘못되었을 수 있습니다.이 정보가 나중에 왜성에서 선언문에 중복 될 수 있습니다.

+0

실제로 나는 다른 DIE가 'DW_AT_specification'필드를 통해 첫 번째 DIE를 가리키는 것을 발견했습니다. – user7094