• Wang Nan's avatar
    perf test: Fix dwarf unwind using libunwind. · b93b0967
    Wang Nan authored
    Perf tool fails to unwind user stack if the event raises in a shared
    object. This patch improves tests/dwarf-unwind.c to demonstrate the
    problem by utilizing commonly used glibc function "bsearch". If perf is
    not statically linked, the testcase will try to unwind a mixed call
    trace.
    
    By debugging libunwind I found that there is a bug in unwind-libunwind:
    it always passes 0 as segbase to libunwind, cause libunwind unable to
    locate debug_frame entry fir first level ip address (I add some more
    debugging output into libunwind to make things clear):
    
                   >_Uarm_dwarf_find_debug_frame: start_ip = 10be98, end_ip = 10c2a4
                   >_Uarm_dwarf_find_debug_frame: found debug_frame table `/lib/libc-2.18.so': segbase=0x0, len=7, gp=0x0, table_data=0x449388
                   >_Uarm_dwarf_search_unwind_table: call lookup:ip = b6cd3bcc, segbase = 0, rel_ip = b6cd3bcc
                   >lookup: e->start_ip_offset = bcf18 (rel_ip = b6cd3bcc)
                   >lookup: e->start_ip_offset = 6d314 (rel_ip = b6cd3bcc)
                   >lookup: e->start_ip_offset = 33d0c (rel_ip = b6cd3bcc)
                    ...
                   >lookup: e->start_ip_offset = 15d0c (rel_ip = b6cd3bcc)
                   >lookup: e->start_ip_offset = 15c40 (rel_ip = b6cd3bcc)
     >_Uarm_dwarf_search_unwind_table: IP b6cd3bcc inside range b6c12000-b6d4c000, but no explicit unwind info found
                    >put_rs_cache: unmasking signals/interrupts and releasing lock
                   >_Uarm_dwarf_step: returning -10
     >_Uarm_step: dwarf_step()=-10
    
    This patch passes map->start as segbase to dwarf_find_debug_frame(), so
    di will be initialized correctly.
    
    In addition, dso and executable are different when setting segbase. This
    patch first check whether the elf is executable, and pass segbase only
    for shared object.
    Signed-off-by: default avatarWang Nan <wangnan0@huawei.com>
    Acked-by: default avatarJiri Olsa <jolsa@kernel.org>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Li Zefan <lizefan@huawei.com>
    Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Paul Mackerras <paulus@samba.org>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Link: http://lkml.kernel.org/r/1421203007-75799-1-git-send-email-wangnan0@huawei.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    b93b0967
unwind-libunwind.c 14.7 KB