perf probe实例

2460阅读 0评论2020-12-17 静默梧桐
分类:LINUX

Define new dynamic tracepoints,This command defines dynamic tracepoint events, by symbol and registers without debuginfo, or by C expressions (C line numbers, C function names, and C local variables) with debuginfo.
动态跟踪的一些实例:

1. perf probe -L do_sys_open
Show source code lines which can be probed
root@jianlin-100:/home/jianlin# perf probe -L do_sys_open

      0  long do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode)
         {
      2         struct open_how how = build_open_how(flags, mode);
      3         return do_sys_openat2(dfd, filename, &how);
         }



2.perf probe -V
Show available local variables at given probe point.
显示可以被跟踪的局部变量;
root@jianlin-100:/home/jianlin# perf probe -V do_sys_open
Available variables at do_sys_open
        @
                char*   filename
                int     dfd
                int     flags
                struct open_how how
                umode_t mode

3.perf probe -a
Define a probe event (see PROBE SYNTAX for detail).
定义了一个动态event; 选中filename,并以字符串格式输出;
root@jianlin-100:/home/jianlin# perf probe -a 'do_sys_open filename:string'
Added new event:
  probe:do_sys_open    (on do_sys_open with filename:string)


You can now use it in all perf tools, such as:


        perf record -e probe:do_sys_open -aR sleep 1



4.perf record
root@jianlin-100:/home/jianlin# perf record -e probe:do_sys_open -aR cat ./kube-join.info > /dev/null
cat: ./kube-join.info: No such file or directory
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.180 MB perf.data (18 samples) ]

5.  显示trace的输出
display trace output

首先是perf report --stdio,貌似看不出来什么
root@jianlin-100:/home/jianlin# perf report --stdio
# To display the perf.data header info, please use --header/--header-only options.
#
#
# Total Lost Samples: 0
#
# Samples: 18  of event 'probe:do_sys_open'
# Event count (approx.): 18
#
# Overhead  Command  Shared Object     Symbol
# ........  .......  ................  ...............
#
    94.44%  cat      [kernel.vmlinux]  [k] do_sys_open
     5.56%  perf     [kernel.vmlinux]  [k] do_sys_open



使用perf  script试试:
root@jianlin-100:/home/jianlin# perf  script
            perf 3559160 [007] 1710448.751491: probe:do_sys_open: (ffff800010368e20) filename_string="/proc/3559161/status"
             cat 3559161 [001] 1710448.752954: probe:do_sys_open: (ffff800010368e20) filename_string="/etc/ld.so.cache"
             cat 3559161 [001] 1710448.752993: probe:do_sys_open: (ffff800010368e20) filename_string="/lib/aarch64-linux-gnu/libc.so.6"
             cat 3559161 [001] 1710448.753307: probe:do_sys_open: (ffff800010368e20) filename_string="/usr/lib/locale/locale-archive"
             cat 3559161 [001] 1710448.753397: probe:do_sys_open: (ffff800010368e20) filename_string="./kube-join.info"
             cat 3559161 [001] 1710448.753530: probe:do_sys_open: (ffff800010368e20) filename_string="/usr/share/locale/locale.alias"
             cat 3559161 [001] 1710448.753628: probe:do_sys_open: (ffff800010368e20) filename_string="/usr/share/locale/en_US.UTF-8/LC_MESSAGES/libc.mo"
             cat 3559161 [001] 1710448.753637: probe:do_sys_open: (ffff800010368e20) filename_string="/usr/share/locale/en_US.utf8/LC_MESSAGES/libc.mo"
             cat 3559161 [001] 1710448.753645: probe:do_sys_open: (ffff800010368e20) filename_string="/usr/share/locale/en_US/LC_MESSAGES/libc.mo"
             cat 3559161 [001] 1710448.753652: probe:do_sys_open: (ffff800010368e20) filename_string="/usr/share/locale/en.UTF-8/LC_MESSAGES/libc.mo"
             cat 3559161 [001] 1710448.753659: probe:do_sys_open: (ffff800010368e20) filename_string="/usr/share/locale/en.utf8/LC_MESSAGES/libc.mo"
             cat 3559161 [001] 1710448.753665: probe:do_sys_open: (ffff800010368e20) filename_string="/usr/share/locale/en/LC_MESSAGES/libc.mo"
             cat 3559161 [001] 1710448.753674: probe:do_sys_open: (ffff800010368e20) filename_string="/usr/share/locale-langpack/en_US.UTF-8/LC_MESSAGES/libc.mo"
             cat 3559161 [001] 1710448.753683: probe:do_sys_open: (ffff800010368e20) filename_string="/usr/share/locale-langpack/en_US.utf8/LC_MESSAGES/libc.mo"
             cat 3559161 [001] 1710448.753690: probe:do_sys_open: (ffff800010368e20) filename_string="/usr/share/locale-langpack/en_US/LC_MESSAGES/libc.mo"
             cat 3559161 [001] 1710448.753698: probe:do_sys_open: (ffff800010368e20) filename_string="/usr/share/locale-langpack/en.UTF-8/LC_MESSAGES/libc.mo"
             cat 3559161 [001] 1710448.753706: probe:do_sys_open: (ffff800010368e20) filename_string="/usr/share/locale-langpack/en.utf8/LC_MESSAGES/libc.mo"
             cat 3559161 [001] 1710448.753715: probe:do_sys_open: (ffff800010368e20) filename_string="/usr/share/locale-langpack/en/LC_MESSAGES/libc.mo"


如果只关心filename_string,可以使用 perf report --sort filename_string
root@jianlin-100:/home/jianlin# perf report --sort filename_string
# To display the perf.data header info, please use --header/--header-only options.
#
#
# Total Lost Samples: 0
#
# Samples: 18  of event 'probe:do_sys_open'
# Event count (approx.): 18
#
# Overhead                                               filename_string
# ........  ............................................................
#
     5.56%                              "/usr/share/locale/locale.alias"
     5.56%                 "/usr/share/locale/en_US/LC_MESSAGES/libc.mo"
     5.56%            "/usr/share/locale/en_US.utf8/LC_MESSAGES/libc.mo"
     5.56%           "/usr/share/locale/en_US.UTF-8/LC_MESSAGES/libc.mo"
     5.56%                    "/usr/share/locale/en/LC_MESSAGES/libc.mo"
     5.56%               "/usr/share/locale/en.utf8/LC_MESSAGES/libc.mo"
     5.56%              "/usr/share/locale/en.UTF-8/LC_MESSAGES/libc.mo"
     5.56%        "/usr/share/locale-langpack/en_US/LC_MESSAGES/libc.mo"
     5.56%   "/usr/share/locale-langpack/en_US.utf8/LC_MESSAGES/libc.mo"
     5.56%  "/usr/share/locale-langpack/en_US.UTF-8/LC_MESSAGES/libc.mo"
     5.56%           "/usr/share/locale-langpack/en/LC_MESSAGES/libc.mo"
     5.56%      "/usr/share/locale-langpack/en.utf8/LC_MESSAGES/libc.mo"
     5.56%     "/usr/share/locale-langpack/en.UTF-8/LC_MESSAGES/libc.mo"
     5.56%                              "/usr/lib/locale/locale-archive"
     5.56%                                        "/proc/3559161/status"
     5.56%                            "/lib/aarch64-linux-gnu/libc.so.6"
     5.56%                                            "/etc/ld.so.cache"
     5.56%                                            "./kube-join.info"




对kernel modules的符号的操作,
以vxlan举例,perf probe -F 找不到vxlan的符号;
root@jianlin-100:/home/jianlin# perf probe -F |grep -i vxlan
root@jianlin-100:/home/jianlin#

这里需要-m flag ,指明module的路径:
root@jianlin-100:/home/jianlin# perf probe -m /lib/modules/5.10.0-rc3+/kernel/drivers/net/vxlan.ko -L vxlan_xmit

      0  static netdev_tx_t vxlan_xmit(struct sk_buff *skb, struct net_device *dev)
         {
      2         struct vxlan_dev *vxlan = netdev_priv(dev);
                struct vxlan_rdst *rdst, *fdst = NULL;
                const struct ip_tunnel_info *info;
                bool did_rsc = false;
                struct vxlan_fdb *f;
                struct ethhdr *eth;
                __be32 vni = 0;

                info = skb_tunnel_info(skb);

     12         skb_reset_mac_header(skb);

     14         if (vxlan->cfg.flags & VXLAN_F_COLLECT_METADATA) {
     15                 if (info && info->mode & IP_TUNNEL_INFO_BRIDGE &&

其它操作没有差别:
root@jianlin-100:/home/jianlin# perf probe -m /lib/modules/5.10.0-rc3+/kernel/drivers/net/vxlan.ko -a 'vxlan_xmit dev->name:string'
Added new event:
  probe:vxlan_xmit     (on vxlan_xmit in vxlan with name=dev->name:string)


You can now use it in all perf tools, such as:


        perf record -e probe:vxlan_xmit -aR sleep 1


root@jianlin-100:/home/jianlin# perf record -e  probe:vxlan_xmit -a ping -c  3 172.200.18.102
PING 172.200.18.102 (172.200.18.102) 56(84) bytes of data.
64 bytes from 172.200.18.102: icmp_seq=1 ttl=64 time=0.770 ms
64 bytes from 172.200.18.102: icmp_seq=2 ttl=64 time=0.878 ms
64 bytes from 172.200.18.102: icmp_seq=3 ttl=64 time=0.799 ms


--- 172.200.18.102 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 0.770/0.815/0.878/0.045 ms
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.194 MB perf.data (3 samples) ]
root@jianlin-100:/home/jianlin# perf report -n --sort name
# To display the perf.data header info, please use --header/--header-only options.
#
#
# Total Lost Samples: 0
#
# Samples: 3  of event 'probe:vxlan_xmit'
# Event count (approx.): 3
#
# Overhead       Samples        name
# ........  ............  ..........
#
   100.00%             3  "vxlan100"




# Samples: 0  of event 'dummy:HG'
# Event count (approx.): 0
#
# Overhead       Samples
# ........  ............
#




#
# (Tip: For a higher level overview, try: perf report --sort comm,dso)
#












上一篇:snort3: DAQ
下一篇:Cache and Self-Modifying Code