如何使用perf stat获取程序的退出代码?

时间:2016-01-14 10:30:32

标签: linux bash exit-code perf

我必须得到一些具有perf stat的程序的统计数据,即

perf stat -o stat.log ./a.out

我还必须获得这些程序的退出代码,因为它们不会总是以0退出。假设我有简单的程序将返回SIGSEGV:

main(){*(int*)0=0;}

现在,当我运行它时,我得到了:

$ ./a.out Segmentation fault (core dumped) $ echo $? 139

当我用perf运行时,我得到了

$ perf stat -o stat.log ./a.out ./a.out: Segmentation fault $ echo $? 0

我得到0,好像程序没有错误完成。

当我使用perf stat运行它时,如何获得a.out的退出代码?

编辑:a.out是blackbox,我无法以任何方式对其进行修改。

2 个答案:

答案 0 :(得分:1)

简答:

perf stat自动返回正在运行的程序的退出代码。问题是你正在尝试从shell获取返回代码。

更长的回答:

您的示例中发生的事情是,当您运行./a.out程序时,它会产生段错误。 Bash(或任何你的shell)捕获段错误并适当地设置返回值。

当您使用perf stat运行命令时,未设置segfaults程序的退出代码。所以你得到一个0退出代码,因为perf本身正确退出(这可能会误导perf将退出代码设置为段错误,因为在这种情况下perf不会出现段错误。)

要获取段错误(或其他异常终止)退出代码结果,您可以使用帮助程序脚本从shell获取返回代码,然后将其返回到perf。例如,以下内容对我有用:

#!/bin/bash
`/bin/bash -c "$@"`

使用此wrapper.sh脚本使用./a.out调用perf stat程序,可获得所需的139返回码。

$ perf stat ./wrapper.sh ./a.out 

Performance counter stats for './wrapper.sh ./a.out':

          9.959972      task-clock (msec)         #    0.766 CPUs utilized          
                 5      context-switches          #    0.502 K/sec                  
                 3      cpu-migrations            #    0.301 K/sec                  
               464      page-faults               #    0.047 M/sec                  
        16,413,813      cycles                    #    1.648 GHz                    
         7,262,551      stalled-cycles-frontend   #   44.25% frontend cycles idle   
         4,830,727      stalled-cycles-backend    #   29.43% backend  cycles idle   
        22,785,421      instructions              #    1.39  insns per cycle        
                                                  #    0.32  stalled cycles per insn
         4,699,645      branches                  #  471.853 M/sec                  
           124,437      branch-misses             #    2.65% of all branches        

       0.013010875 seconds time elapsed

$ echo $?
139

答案 1 :(得分:0)

你可能得到0退出代码,因为perf stat已成功运行。 您应该在执行命令后立即在a.out中获取退出代码。