32

我正在研究Linux环境。我有两个“C”源包 train 和 test_train。

  1. train 包编译时生成 libtrain.so
  2. test_train 链接到 libtrain.so 并生成可执行的 train-test

现在我想使用 gprof 生成一个调用图,它显示了主程序以及 libtrain.so 中的函数调用序列

我正在使用 -pg 选项编译和链接这两个包,调试级别为 o0。在我执行 ./train-test 之后,会生成 gmon.out。然后我做:

$ gprof -q ./train-test gmon.out

在这里,输出显示了 train-test 中函数的调用图,而不是 libtrain.so 中的函数调用图

可能是什么问题呢 ?

4

3 回答 3

26

gprof不起作用,您需要sprof改用。我发现这些链接很有帮助:

来自第二个链接的摘要:

  1. 在调试 (-g) 模式下编译您的共享库 (libmylib.so)。没有-pg。
  2. 导出 LD_PROFILE_OUTPUT=`密码`
  3. 导出 LD_PROFILE=libmylib.so
  4. rm -f $LD_PROFILE.profile
  5. 执行加载 libmylib.so 的程序
  6. sprof PATH-TO-LIB/$LD_PROFILE $LD_PROFILE.profile -p >log
  7. 查看日志。

我发现在第 2 步中,它必须是一个现有目录——否则你会得到一个有用的警告。在第 3 步中,您可能需要将库指定为libmylib.so.X(甚至可能.X.Y,不确定)——否则您不会收到任何警告。

于 2011-02-10T15:40:16.653 回答
3

我正在从 Python 加载我的库,但对sprof. 相反,我使用oprofile了 Fedora 存储库中的 ,至少:

operf --callgraph /path/to/mybinary

等待您的应用程序完成或执行 Ctl-c 停止分析。现在让我们生成一个概要文件:

opreport --callgraph --symbols

请参阅文档来解释它。这有点乱。在生成的报告中,每个符号都列在自己的块中。该块的主要符号是没有缩进的符号。它上面的项目是调用该函数的函数,它下面的项目是被它调用的东西。以下部分中的百分比是它在这些被调用者中花费的相对时间量。

于 2016-10-27T20:51:21.260 回答
1

如果您不在 Linux 上(就像我在 Solaris 上一样),那么您只是不走运,因为那里没有sprof。如果您有库的源代码,则可以通过链接静态库并使用该库生成分析二进制文件来解决您的问题。我设法跟踪对共享库的调用的另一种方法是使用truss. 通过该选项-u [!]lib,...:[:][!]func, ...,您可以很好地了解跑步的通话记录。它与分析并不完全相同,但在某些情况下可能非常有用。

于 2011-09-01T15:01:58.000 回答