• Wang Nan's avatar
    perf probe: Try to use symbol table if searching debug info failed · 1c0bd0e8
    Wang Nan authored
    A problem can occur in a statically linked perf when vmlinux can be found:
    
     # perf probe --add sys_epoll_pwait
     probe-definition(0): sys_epoll_pwait
     symbol:sys_epoll_pwait file:(null) line:0 offset:0 return:0 lazy:(null)
     0 arguments
     Looking at the vmlinux_path (7 entries long)
     Using /lib/modules/4.2.0-rc1+/build/vmlinux for symbols
     Open Debuginfo file: /lib/modules/4.2.0-rc1+/build/vmlinux
     Try to find probe point from debuginfo.
     Symbol sys_epoll_pwait address found : ffffffff8122bd40
     Matched function: SyS_epoll_pwait
     Failed to get call frame on 0xffffffff8122bd40
     An error occurred in debuginfo analysis (-2).
       Error: Failed to add events. Reason: No such file or directory (Code: -2)
    
    The reason is caused by libdw that, if libdw is statically linked, it
    can't load libebl_{arch}.so reliable.
    
    In this case it is still possible to get the address from
    /proc/kalksyms.  However, perf tries that only when libdw returns
    -EBADF.
    
    This patch gives it another chance to utilize symbol table, even if
    libdw returns an error code other than -EBADF.
    
    After applying this patch:
    
     # perf probe -nv --add sys_epoll_pwait
     probe-definition(0): sys_epoll_pwait
     symbol:sys_epoll_pwait file:(null) line:0 offset:0 return:0 lazy:(null)
     0 arguments
     Looking at the vmlinux_path (7 entries long)
     Using /lib/modules/4.2.0-rc1+/build/vmlinux for symbols
     Open Debuginfo file: /lib/modules/4.2.0-rc1+/build/vmlinux
     Try to find probe point from debuginfo.
     Symbol sys_epoll_pwait address found : ffffffff8122bd40
     Matched function: SyS_epoll_pwait
     Failed to get call frame on 0xffffffff8122bd40
     An error occurred in debuginfo analysis (-2).
     Trying to use symbols.
     Opening /sys/kernel/debug/tracing/kprobe_events write=1
     Added new event:
     Writing event: p:probe/sys_epoll_pwait _text+2276672
       probe:sys_epoll_pwait (on sys_epoll_pwait)
    
     You can now use it in all perf tools, such as:
    
     	perf record -e probe:sys_epoll_pwait -aR sleep 1
    
    Although libdw returns an error (Failed to get call frame), perf tries
    symbol table and finally gets correct address.
    Signed-off-by: default avatarWang Nan <wangnan0@huawei.com>
    Cc: Alexei Starovoitov <ast@plumgrid.com>
    Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
    Cc: Daniel Borkmann <daniel@iogearbox.net>
    Cc: David Ahern <dsahern@gmail.com>
    Cc: He Kuang <hekuang@huawei.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Kaixu Xia <xiakaixu@huawei.com>
    Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Zefan Li <lizefan@huawei.com>
    Cc: pi3orama@163.com
    Link: http://lkml.kernel.org/r/1440151770-129878-2-git-send-email-wangnan0@huawei.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    1c0bd0e8
probe-event.c 61.9 KB