在 bash 脚本中执行时未生成 gprof 输出

Posted

技术标签:

【中文标题】在 bash 脚本中执行时未生成 gprof 输出【英文标题】:gprof output not being generated when executed in bash script 【发布时间】:2013-05-23 23:01:09 【问题描述】:

我已经编译了我的应用程序并将其与-pg 链接,当运行该应用程序时,我得到了正确的gmon.out 文件,并且可以使用gprof 对其进行分析。我在不同情况下运行了许多脚本,以发现我们软件的两个版本之间的速度问题。

当我运行应用程序时,我会生成gmon.out 输出。

因为我必须为许多不同的脚本执行此操作,所以我将它们堆成一个脚本来运行,这样我就可以小睡一下了。这并不复杂。我也在与其他版本的应用程序同时在另一个目录中运行此脚本。

./test test1.script
gprof test > test1.ver1.stats
rm -f gmon.out
./test test2.script
gprof test > test2.ver1.stats
rm -f gmon.out

这些不会生成gmon.out 文件。这种行为有什么解释吗?此外,在不分析正在运行的其他版本的情况下运行脚本(例如,连接脚本而不是并行运行它们)也会产生相同的行为。

【问题讨论】:

【参考方案1】:

我用来测试应用程序更改目录以获取大型数据集的脚本。这会影响gmon.out 位置,因此当应用程序退出时,它会被写入那个遥远的目录。正如GNU GProf manual 所说,

gmon.out 文件是写在程序当前工作的 退出时的目录。这意味着如果您的程序调用 chdir,gmon.out 文件将保留在您的最后一个目录中 程序 chdir'd 到。如果你没有权限写这个 目录,文件没有写入,你会得到一个错误信息。

昨晚我让脚本运行,

GMON_OUT_PREFIX=test1.ver1.out ./test test1.script
GMON_OUT_PREFIX=test2.ver1.out ./test test2.script
GMON_OUT_PREFIX=test3.ver1.out ./test test3.script

虽然我在工作目录中找不到文件,但最终还是在数据文件夹中找到了文件。在上面,为输出指定不同的名称并不重要,因为它们是由它们的进程 ID 进行的(例如,GMON_OUT_PREFIX.PID),但在我的情况下区分测试是必要的。

【讨论】:

以上是关于在 bash 脚本中执行时未生成 gprof 输出的主要内容,如果未能解决你的问题,请参考以下文章

从包装二进制文件调用脚本时未设置 Bash 变量

gprof 不为需要合理时间执行的程序产生任何输出

将多个 gprof 结果文件合并到一个文件中

关于gprof和gprof2dot生成的图的一些疑惑

在 bash 脚本中执行命令,直到输出超过某个值

gprof 和 eclipse 错误