Linux 收集并汇总“strace”命令的统计信息?
我知道我可以运行Linux 收集并汇总“strace”命令的统计信息?,linux,bash,shell,operating-system,sh,Linux,Bash,Shell,Operating System,Sh,我知道我可以运行strace-cls来收集ls可执行文件上的系统调用统计信息。但是,我想在不同的可执行文件上多次运行命令strace-c{some executable here} 我想合并“syscall”和“calls”列。因此,例如,如果ls进行了19次mmap系统调用,而tr进行了11次mmap系统调用,我想合并这些结果,以便最终的统计数据在某个文件中只显示30次mmap系统调用。此外,如果系统调用只出现在一个可执行文件中,那么它仍然应该包含在最终结果中 我该怎么做?您可以使用strac
strace-cls
来收集ls
可执行文件上的系统调用统计信息。但是,我想在不同的可执行文件上多次运行命令strace-c{some executable here}
我想合并“syscall”和“calls”列。因此,例如,如果ls
进行了19次mmap
系统调用,而tr
进行了11次mmap
系统调用,我想合并这些结果,以便最终的统计数据在某个文件中只显示30次mmap
系统调用。此外,如果系统调用只出现在一个可执行文件中,那么它仍然应该包含在最终结果中
我该怎么做?您可以使用
strace-o
选项将输出保存到文件中,然后使用这些文件进行diff
使用strace-o“filename-$(date+%T)”将时间参数传递给文件名
将文件连接到cat file1 file2>file3
使用grep
将输出重定向到文件名为的文件,以查找mmap调用,然后通过管道将这些调用(在Debian变体上,使用apt install datamash
安装)按第5列分组(即mmap),并对第4列求和:
for f in /bin/ls /bin/tr ; do strace -c $f 2>&1 ; done |
grep mmap | datamash -W -g5 sum 4
输出:
mmap 29
GroupBy(syscall) sum(calls)
access 9
arch_prctl 3
brk 5
close 23
execve 3
fstat 22
getcwd 1
ioctl 1
mmap 31
mprotect 12
munmap 3
open 34
read 5
write 1
显示类似数据在发布之前的样子的示例
总结:
-s
开关允许datamash
分组、排序和单独求和
所有系统调用:
for f in /bin/pwd /bin/false /bin/true ; do
strace -c $f 2>&1 > /dev/null |
grep -v ':' | cut --complement -c 42-50 |
sed '1s/^% /%_/;2d' | head -n -2 ;
done | sed -n '1p;/^%/d;p' | datamash -HW -sg5 sum 4 |
xargs printf "%-12s\t%14s\n"
(请注意,strace
输出需要清洁,这是由
cut
,sed
,等等…)
输出:
mmap 29
GroupBy(syscall) sum(calls)
access 9
arch_prctl 3
brk 5
close 23
execve 3
fstat 22
getcwd 1
ioctl 1
mmap 31
mprotect 12
munmap 3
open 34
read 5
write 1
谷歌将输出重定向到文件(append)请指定strace-c
中的哪些列应该合并(或者大概添加)。是的,Drako,你是对的。将输出重定向到文件不是主要问题。它正在合并我正在处理的strace-c{some executable here}
命令的统计信息。我只是为了完整才把它包括进去。什么样的合并?您的首选输出是什么?@agc。我想合并“syscall”和“calls”列。因此,例如,如果ls
进行了19次mmap
系统调用,而tr
进行了11次mmap
系统调用,我想合并这些结果,以便最终的统计数据在某个文件中只显示30次mmap
系统调用。此外,如果一个系统调用只出现在一个可执行文件中,它仍应包含在最终结果中。谢谢@agc。这就是我要找的。