【问题标题】:Collect and sum statistics of `strace` commands?收集和汇总“strace”命令的统计信息?
【发布时间】:2017-11-26 18:07:24
【问题描述】:

我知道我可以运行strace -c ls 来收集ls 可执行文件的系统调用统计信息。但是,我想在不同的可执行文件上多次运行命令strace -c {some executable here},合并各个结果,然后写入单个文件。

我想合并 'syscall' 和 'calls' 列。因此,例如,如果ls 进行了 19 个 mmap 系统调用,tr 进行了 11 个 mmap 系统调用,我想合并这些结果,以便最终统计数据仅显示 30 个 mmap 系统调用文件。此外,如果系统调用只出现在一个可执行文件中,它仍应包含在最终结果中。

我该怎么做?

【问题讨论】:

  • google 将输出重定向到文件(追加)
  • 请指定strace -c 中的哪些列应该被合并,(或添加,大概)。
  • 是的,德拉科,你是对的。将输出重定向到文件不是主要问题。它正在合并我正在努力解决的strace -c {some exectuable here} 命令的统计信息。为了完整起见,我只是将其包括在内。
  • 什么样的合并?你的首选输出是什么?
  • @agc。我想合并 'syscall' 和 'calls' 列。因此,例如,如果ls 进行了 19 个 mmap 系统调用,而 tr 进行了 11 个 mmap 系统调用,我想合并这些结果,以便最终统计数据在某些情况下仅显示 30 个 mmap 系统调用文件。此外,如果系统调用只出现在一个可执行文件中,它仍应包含在最终结果中。

标签: linux bash shell operating-system sh


【解决方案1】:

使用grep 查找mmap 调用,然后通过管道传送到datamash(在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

  1. 显示相似数据在之前是什么样子的示例 总结:

    for f in /bin/false /bin/true ; do strace -c $f 2>&1 ; done |  
         grep mmap | tee /tmp/old | datamash -W -g5 sum 4 ; echo --- ; cat /tmp/old
    
    mmap    12
    ---
      0.00    0.000000           0         6           mmap
      0.00    0.000000           0         6           mmap
    
  2. -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 输出需要清理,由 cutsed...)

    输出:

    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
    

【讨论】:

  • 谢谢@agc。这就是我一直在寻找的。​​span>
【解决方案2】:

您可以使用strace -o <filename> 选项将输出保存到文件中,然后使用文件制作diff

将时间参数传递给strace -o "filename-$(date +%T)"的文件名

cat file1 file2 > file3连接文件

使用> filename将输出重定向到文件

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-19
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 2016-01-28
    • 2019-08-18
    相关资源
    最近更新 更多