Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 收集并汇总“strace”命令的统计信息?_Linux_Bash_Shell_Operating System_Sh - Fatal编程技术网

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。这就是我要找的。