• H
    perf probe: Search both .eh_frame and .debug_frame sections for probe location · 270bde1e
    Hemant Kumar 提交于
    'perf probe' through debuginfo__find_probes() in util/probe-finder.c
    checks for the functions' frame descriptions in either .eh_frame section
    of an ELF or the .debug_frame.
    
    The check is based on whether either one of these sections is present.
    Depending on distro, toolchain defaults, architetcutre, build flags,
    etc., CFI might be found in either .eh_frame and/or .debug_frame.
    Sometimes, it may happen that, .eh_frame, even if present, may not be
    complete and may miss some descriptions.
    
    Therefore, to be sure, to find the CFI covering an address we will
    always have to investigate both if available.
    
    For e.g., in powerpc, this may happen:
      $ gcc -g bin.c -o bin
    
      $ objdump --dwarf ./bin
      <1><145>: Abbrev Number: 7 (DW_TAG_subprogram)
         <146> DW_AT_external   : 1
         <146> DW_AT_name       : (indirect string, offset: 0x9e): main
         <14a> DW_AT_decl_file  : 1
         <14b> DW_AT_decl_line  : 39
         <14c> DW_AT_prototyped : 1
         <14c> DW_AT_type       : <0x57>
         <150> DW_AT_low_pc     : 0x100007b8
    
    If the .eh_frame and .debug_frame are checked for the same binary, we
    will find that, .eh_frame (although present) doesn't contain a
    description for "main" function.
    
    But, .debug_frame has a description:
    
      000000d8 00000024 00000000 FDE cie=00000000 pc=100007b8..10000838
        DW_CFA_advance_loc: 16 to 100007c8
        DW_CFA_def_cfa_offset: 144
        DW_CFA_offset_extended_sf: r65 at cfa+16
      ...
    
    Due to this (since, perf checks whether .eh_frame is present and goes on
    searching for that address inside that frame), perf is unable to process
    the probes:
    
      # perf probe -x ./bin main
        Failed to get call frame on 0x100007b8
        Error: Failed to add events.
    
    To avoid this issue, we need to check both the sections (.eh_frame and
    .debug_frame), which is done in this patch.
    
    Note that, we can always force everything into both .eh_frame and
    .debug_frame by:
    
      $ gcc bin.c -fasynchronous-unwind-tables  -fno-dwarf2-cfi-asm -g -o bin
    Signed-off-by: NHemant Kumar <hemant@linux.vnet.ibm.com>
    Acked-by: NMasami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
    Cc: linuxppc-dev@lists.ozlabs.org
    Cc: Mark Wielaard <mjw@redhat.com>
    Cc: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
    Cc: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
    Link: http://lkml.kernel.org/r/1454426806-13974-1-git-send-email-hemant@linux.vnet.ibm.comSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
    270bde1e
probe-finder.c 44.6 KB