gprof:如何为链接到主程序的共享库中的函数生成调用图

时间:2009-12-03 10:18:56

标签: c debugging profiling gprof sprof

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

  1. 编译时训练包生成libtrain.so
  2. test_train链接到libtrain.so并生成可执行的train-test
  3. 现在我想使用gprof生成一个调用图,它显示主程序中的函数调用顺序以及libtrain.so中的函数调用

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

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

    这里,输出显示列车测试中函数的调用图,但不显示libtrain.so

    可能是什么问题?

3 个答案:

答案 0 :(得分:19)

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

第二个链接摘要:

  1. 以debug(-g)模式编译共享库(libmylib.so)。没有-pg。
  2. export LD_PROFILE_OUTPUT =`pwd`
  3. export LD_PROFILE = libmylib.so
  4. rm -f $ LD_PROFILE.profile
  5. 执行加载libmylib.so
  6. 的程序
  7. sprof PATH-TO-LIB / $ LD_PROFILE $ LD_PROFILE.profile -p> log
  8. 请参阅日志。
  9. 我发现在第2步中,它需要是一个现有目录 - 否则你会得到一个有用的警告。在第3步中,您可能需要将库指定为libmylib.so.X(甚至可能.X.Y,但不确定) - 否则您不会收到任何警告。

答案 1 :(得分:2)

我从Python加载我的库并且没有sprof的运气。相反,我使用了oprofile,它位于Fedora存储库中,至少是:

  

operf --callgraph /path/to/mybinary

     

等待您的应用程序完成或执行Ctl-c以停止分析。现在让我们生成个人资料摘要:

     

opreport --callgraph --symbols

请参阅documentation进行解释。这有点乱。在生成的报告中,每个符号都列在自己的块中。该块的主要符号是不缩进的符号。它上面的项是调用该函数的函数,而它下面的函数是由它调用的函数。以下部分中的百分比是它们在这些被监禁者中花费的相对时间。

答案 2 :(得分:0)

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