• Wang Nan's avatar
    perf probe: Clear probe_trace_event when add_probe_trace_event() fails · 092b1f0b
    Wang Nan authored
    When probing with a glob, errors in add_probe_trace_event() won't be
    passed to debuginfo__find_trace_events() because it would be modified by
    probe_point_search_cb(). It causes a segfault if perf fails to find an
    argument for a probe point matched by the glob. For example:
    
      # ./perf probe -v -n 'SyS_dup? oldfd'
      probe-definition(0): SyS_dup? oldfd
      symbol:SyS_dup? file:(null) line:0 offset:0 return:0 lazy:(null)
      parsing arg: oldfd into oldfd
      1 arguments
      Looking at the vmlinux_path (7 entries long)
      Using /lib/modules/4.3.0-rc4+/build/vmlinux for symbols
      Open Debuginfo file: /lib/modules/4.3.0-rc4+/build/vmlinux
      Try to find probe point from debuginfo.
      Matched function: SyS_dup3
      found inline addr: 0xffffffff812095c0
      Probe point found: SyS_dup3+0
      Searching 'oldfd' variable in context.
      Converting variable oldfd into trace event.
      oldfd type is long int.
      found inline addr: 0xffffffff812096d4
      Probe point found: SyS_dup2+36
      Searching 'oldfd' variable in context.
      Failed to find 'oldfd' in this function.
      Matched function: SyS_dup3
      Probe point found: SyS_dup3+0
      Searching 'oldfd' variable in context.
      Converting variable oldfd into trace event.
      oldfd type is long int.
      Matched function: SyS_dup2
      Probe point found: SyS_dup2+0
      Searching 'oldfd' variable in context.
      Converting variable oldfd into trace event.
      oldfd type is long int.
      Found 4 probe_trace_events.
      Opening /sys/kernel/debug/tracing//kprobe_events write=1
      Writing event: p:probe/SyS_dup3 _text+2135488 oldfd=%di:s64
      Segmentation fault (core dumped)
      #
    
    This patch ensures that add_probe_trace_event() doesn't touches
    tf->ntevs and tf->tevs if those functions fail.
    
    After the patch:
    
      # perf probe  'SyS_dup? oldfd'
      Failed to find 'oldfd' in this function.
      Added new events:
        probe:SyS_dup3       (on SyS_dup? with oldfd)
        probe:SyS_dup3_1     (on SyS_dup? with oldfd)
        probe:SyS_dup2       (on SyS_dup? with oldfd)
    
      You can now use it in all perf tools, such as:
    
    	perf record -e probe:SyS_dup2 -aR sleep 1
    Signed-off-by: default avatarWang Nan <wangnan0@huawei.com>
    Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Alexei Starovoitov <ast@kernel.org>
    Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
    Cc: Zefan Li <lizefan@huawei.com>
    Cc: pi3orama@163.com
    Link: http://lkml.kernel.org/r/1447417761-156094-3-git-send-email-wangnan0@huawei.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    092b1f0b
probe-finder.c 44.2 KB