• Sandipan Das's avatar
    perf script: Show correct offsets for DWARF-based unwinding · 2a9d5050
    Sandipan Das authored
    When perf/data is recorded with the dwarf call-graph option, the
    callchain shown by 'perf script' still shows the binary offsets of the
    userspace symbols instead of their virtual addresses. Since the symbol
    offset calculation is based on using virtual address as the ip, we see
    incorrect offsets as well.
    
    The use of virtual addresses affects the ability to find out the
    line number in the corresponding source file to which an address
    maps to as described in commit 67540759 ("perf unwind: Use
    addr_location::addr instead of ip for entries").
    
    This has also been addressed by temporarily converting the virtual
    address to the correponding binary offset so that it can be mapped
    to the source line number correctly.
    
    This is a follow-up for commit 19610184 ("perf script: Show
    virtual addresses instead of offsets").
    
    This can be verified on a powerpc64le system running Fedora 27 as
    shown below:
    
      # perf probe -x /usr/lib64/libc-2.26.so -a inet_pton
      # perf record -e probe_libc:inet_pton --call-graph=dwarf ping -6 -c 1 ::1
    
    Before:
    
      # perf report --stdio --no-children -s sym,srcline -g address
    
      # Samples: 1  of event 'probe_libc:inet_pton'
      # Event count (approx.): 1
      #
      # Overhead  Symbol                Source:Line
      # ........  ....................  ...........
      #
         100.00%  [.] __GI___inet_pton  inet_pton.c
                  |
                  ---gaih_inet getaddrinfo.c:537 (inlined)
                     __GI_getaddrinfo getaddrinfo.c:2304 (inlined)
                     main ping.c:519
                     generic_start_main libc-start.c:308 (inlined)
                     __libc_start_main libc-start.c:102
      ...
    
      # perf script -F comm,ip,sym,symoff,srcline,dso
    
      ping
                        15af28 __GI___inet_pton+0xffff000099160008 (/usr/lib64/libc-2.26.so)
        libc-2.26.so[ffff80004ca0af28]
                        10fa53 gaih_inet+0xffff000099160f43
        libc-2.26.so[ffff80004c9bfa53] (inlined)
                        1105b3 __GI_getaddrinfo+0xffff000099160163
        libc-2.26.so[ffff80004c9c05b3] (inlined)
                          2d6f main+0xfffffffd9f1003df (/usr/bin/ping)
        ping[fffffffecf882d6f]
                         2369f generic_start_main+0xffff00009916013f
        libc-2.26.so[ffff80004c8d369f] (inlined)
                         23897 __libc_start_main+0xffff0000991600b7 (/usr/lib64/libc-2.26.so)
        libc-2.26.so[ffff80004c8d3897]
    
    After:
    
      # perf report --stdio --no-children -s sym,srcline -g address
    
      # Samples: 1  of event 'probe_libc:inet_pton'
      # Event count (approx.): 1
      #
      # Overhead  Symbol                Source:Line
      # ........  ....................  ...........
      #
         100.00%  [.] __GI___inet_pton  inet_pton.c
                  |
                  ---gaih_inet.constprop.7 getaddrinfo.c:537
                     getaddrinfo getaddrinfo.c:2304
                     main ping.c:519
                     generic_start_main.isra.0 libc-start.c:308
                     __libc_start_main libc-start.c:102
      ...
    
      # perf script -F comm,ip,sym,symoff,srcline,dso
    
      ping
                  7fffb38aaf28 __GI___inet_pton+0x8 (/usr/lib64/libc-2.26.so)
        inet_pton.c:68
                  7fffb385fa53 gaih_inet.constprop.7+0xf43 (/usr/lib64/libc-2.26.so)
        getaddrinfo.c:537
                  7fffb38605b3 getaddrinfo+0x163 (/usr/lib64/libc-2.26.so)
        getaddrinfo.c:2304
                     130782d6f main+0x3df (/usr/bin/ping)
        ping.c:519
                  7fffb377369f generic_start_main.isra.0+0x13f (/usr/lib64/libc-2.26.so)
        libc-start.c:308
                  7fffb3773897 __libc_start_main+0xb7 (/usr/lib64/libc-2.26.so)
        libc-start.c:102
    Signed-off-by: default avatarSandipan Das <sandipan@linux.ibm.com>
    Acked-by: default avatarJiri Olsa <jolsa@kernel.org>
    Cc: Milian Wolff <milian.wolff@kdab.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
    Cc: Ravi Bangoria <ravi.bangoria@linux.ibm.com>
    Fixes: 67540759 ("perf unwind: Use addr_location::addr instead of ip for entries")
    Link: http://lkml.kernel.org/r/20180703120555.32971-1-sandipan@linux.ibm.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    2a9d5050
unwind-libdw.c 5.47 KB