2013-11-20 3 views
3

와 DW_AT_high_pc에 대한 잘못된 것 같다, 나는 코드 (코드 here입니다) in this page를 발표하려하지만 난 그것을 실행할 때 얻을 :DWARF 정보가 난쟁이하는 초보자로서 GCC 4.8.2

$> ./dwarf_get_func_addr tracedprog 
DW_TAG_subprogram: 'do_stuff' 
abort() in libdwarf. No error argument, no handler. 
zsh: abort (core dumped) ./dwarf_get_func_addr tracedprog 

후 디버그 세션이 문제는 라인 78에서 오는 것으로 보인다 :

else if (attrcode == DW_AT_high_pc) 
     dwarf_formaddr(attrs[i], &highpc, 0); 

문제는, attrs[i]formattrs[i] (이것은 7 대신에 1로 설정 됨) 어드레스 아니다 나타낸다. do_stuff 기능을 위해, 그것은 제공 objdumptracedprog 탐색 : 그것은 단지 두 개의 옥텟 길이로

이 출력에서 ​​
<1><73>: Numéro d'abréviation: 4 (DW_TAG_subprogram) 
    <74> DW_AT_external : 1 
    <74> DW_AT_name  : (chaîne indirecte, décalage: 0x55): do_stuff 
    <78> DW_AT_decl_file : 1 
    <79> DW_AT_decl_line : 4 
    <7a> DW_AT_prototyped : 1 
    <7a> DW_AT_low_pc  : 0x400500 
    <82> DW_AT_high_pc  : 0x3f 
    <8a> DW_AT_frame_base : 1 bloc d'octets: 9c  (DW_OP_call_frame_cfa) 
    <8c> DW_AT_GNU_all_tail_call_sites: 1 
    <8c> DW_AT_sibling  : <0xb9> 

, DW_AT_high_pc 나에게 올바른 보이지 않는다. 다른 컴퓨터에 아무런 문제가없는 같은 gcc 문제가 될 것으로 보인다

$> gcc -g tracedprog2.c -o tracedprog 

편집 : 참고로

, 내가 함께 tracedprog를 컴파일. gcc 4.8.2을 사용하고 있습니다.

답변

2

문제점을 발견했습니다. gcc 4.8에서 시작하여 기본값 인 DWARF 버전은 4입니다. 프로그램을 작동 시키려면 tracedprog-gdwarf-2 플래그로 컴파일해야합니다.

0

참조를 위해 DWARF 4에서 DW_AT_high_pc는 클래스 상수 일 수 있습니다. 이 경우 값은 low_pc로부터의 오프셋입니다. 참조 된 코드는 이것을 처리하지 않습니다.

2

기본 DWARF 버전을 재정의하지 않고을 libdwarf와 함께 gcc> = 4.8로 컴파일하려면이 값을 추출하기 전에 속성의 양식을 확인해야합니다.

DWARF 정보의 버전에 따라 DW_AT_high_pc 속성은 DW_FORM_addr 양식 또는 DW_FORM_data8 양식 일 수 있습니다. 각 양식에는 자체 추출 기능이 있습니다.

void print_attribute(Dwarf_Attribute a) 
{ 
    Dwarf_Half form; 
    Dwarf_Error err; 
    Dwarf_Half attrcode; 
    unsigned int offset = 0; 
    Dwarf_Addr addr; 

    dwarf_whatform(a, &form, &err); 

    switch(form) 
    { 
    case DW_FORM_addr: 
     dwarf_formaddr(a, &addr, &err); 
     printf("DW_FORM_addr: 0x%08llx\n", addr); 
     break; 
    case DW_FORM_data8: 
     dwarf_formudata(a, &offset , &err); 
     printf("DW_FORM_data8: 0x%08llx\n", offset); 
     break; 
    default: 
     break; 
    } 
}   
: 여기

는 특성의 형태를 확인하는 방법의 예는