我必须得到一些具有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,我无法以任何方式对其进行修改。答案 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
中获取退出代码。