• Masami Hiramatsu's avatar
    perf probe: Fix to find line information for probe list · e08cfd4b
    Masami Hiramatsu authored
    Fix to find the correct (as much as possible) line information for
    listing probes. Without this fix, perf probe --list action will show
    incorrect line information as below;
    
      probe:getname_flags  (on getname_flags@ksrc/linux-3/fs/namei.c)
      probe:getname_flags_1 (on getname:-89@x86/include/asm/current.h)
      probe:getname_flags_2 (on user_path_at_empty:-2054@x86/include/asm/current.h)
    
    The minus line number is obviously wrong, and current.h is not related
    to the probe point. Deeper investigation discovered that there were 2
    issues related to this bug, and minor typos too.
    
    The 1st issue is the rack of considering about nested inlined functions,
    which causes the wrong (relative) line number.
    
    The 2nd issue is that the dwarf line info is not correct at those
    points. It points 14th line of current.h.
    
    Since it seems that the line info includes somewhat unreliable
    information, this fixes perf to try to find correct line information
    from both of debuginfo and line info as below.
    
    1) Probe address is the entry of a function instance
    
      In this case, the line is set as the function declared line.
    
    2) Probe address is the entry of an expanded inline function block
    
      In this case, the line is set as the function call-site line.
      This means that the line number is relative from the entry line
      of caller function (which can be an inlined function if nested)
    
    3) Probe address is inside a function instance or an expanded
       inline function block
    
      In this case, perf probe queries the line number from lineinfo
      and verify the function declared file is same as the file name
      queried from lineinfo.
    
      If the file name is different, it is a failure case. The probe
      address is shown as symbol+offset.
    
    4) Probe address is not in the any function instance
    
      This is a failure case, the probe address is shown as
      symbol+offset.
    
    With this fix, perf probe -l shows correct probe lines as below;
    
      probe:getname_flags  (on getname_flags@ksrc/linux-3/fs/namei.c)
      probe:getname_flags_1 (on getname:2@ksrc/linux-3/fs/namei.c)
      probe:getname_flags_2 (on user_path_at_empty:4@ksrc/linux-3/fs/namei.c)
    
    Changes at v2:
     - Fix typos in the function comments. (Thanks to Namhyung Kim)
     - Use die_find_top_inlinefunc instead of die_find_inlinefunc_next.
    Signed-off-by: default avatarMasami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
    Cc: Ingo Molnar <mingo@redhat.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/20130930092144.1693.11058.stgit@udc4-manage.rcp.hitachi.co.jpSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    e08cfd4b
dwarf-aux.c 23 KB