Linux DTrace仍然遥遥无期,不过最近发现bcc功能也很强大,可以打印参数成员变量的内容。
https://github.com/mishuang2017/sm/blob/master/bcc/device_add.py
'modprobe -v mlx5_core'输出如下:
$ sudo ./device_add.py
TIME(s) device name
89873.159791000 ffff9ba9127f3000 ptp4
89873.189094000 ffff9ba7cdf4b008 ib-comp-wq
89873.189173000 ffff9ba7cdf48808 ib-comp-unb-wq
89873.389018000 ffff9ba9127f1000 ptp5
89873.531818000 ffff9ba83e040508 eth0
89873.800179000 ffff9ba843600508 eth0
89873.881128000 ffff9ba8088a0378 mlx5_0
89873.894575000 ffff9ba81e7f0028 uverbs0
89874.640101000 ffff9ba813f20378 mlx5_1
89874.698222000 ffff9ba7e3750028 uverbs1
如果不需要打印成员变量的话,只需要打印参数或者返回值用trace.py更简洁:
# trace 'r::pci_alloc_dev "%llx", retval'
PID TID COMM FUNC -
13820 13820 bash pci_alloc_dev ffff9bb10becb000
13820 13820 bash pci_alloc_dev ffff9ba918f3f000
13820 13820 bash pci_alloc_dev ffff9bb13d805000
# trace 'pci_alloc_dev "%llx", arg1'
PID TID COMM FUNC -
13820 13820 bash pci_alloc_dev ffff9ba91b3c6000
13820 13820 bash pci_alloc_dev ffff9ba91b3c6000
13820 13820 bash pci_alloc_dev ffff9ba91b3c6000
# trace pci_alloc_dev -K
11745 11745 bash pci_alloc_dev
pci_alloc_dev +0x1 [kernel]
sriov_enable +0x327 [kernel]
pci_enable_sriov +0x2b [kernel]
mlx5_core_sriov_configure +0x103 [kernel]
sriov_numvfs_store +0x109 [kernel]
dev_attr_store +0x1b [kernel]
sysfs_kf_write +0x3c [kernel]
kernfs_fop_write +0x125 [kernel]
__vfs_write +0x3a [kernel]
vfs_write +0xb1 [kernel]
ksys_write +0x55 [kernel]
__x64_sys_write +0x1a [kernel]
do_syscall_64 +0x5a [kernel]
entry_SYSCALL_64_after_hwframe +0x44 [kernel]
trace.py也可以用来trace应用程序:
trace 'tc:tc_filter_modify "%d", arg1'