首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >gprof :如何为链接到主程序的共享库中的函数生成调用图

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

Stack Overflow用户
提问于 2009-12-03 18:18:56
回答 3查看 28.2K关注 0票数 31

我在Linux环境下工作。我有两个“C”源包train和test_train。

  1. 列车包在编译时会生成到libtrain.so的libtrain.so
  2. test_train链接,并生成可执行的列车测试

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

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

代码语言:javascript
复制
$ gprof -q ./train-test gmon.out

在这里,输出显示了训练测试中的函数调用图,但不显示在libtrain.so中

可能的问题是什么?

EN

回答 3

Stack Overflow用户

发布于 2011-02-10 23:40:17

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

来自第二个链接的摘要:

  1. 在调试(-g)模式下编译共享库(libmylib.so)。No PROFILE。将LD_PROFILE_OUTPUT=pwd
  2. export LD_PROFILE=libmylib.so
  3. rm配置文件导出到加载libmylib.so
  4. sprof PATH-TO-LIB/$LD_
  5. -f $LD_PROFILE.profile -p >log
  6. 的程序查看日志。

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

票数 24
EN

Stack Overflow用户

发布于 2016-10-28 04:51:21

我正在从Python加载我的库,但在使用sprof时没有遇到任何问题。相反,我使用的是oprofile,它至少在Fedora存储库中:

operf --callgraph /path/to/mybinary

等待应用程序完成或按Ctl-c组合键停止分析。现在让我们生成一个配置文件摘要:

opreport --callgraph --symbols

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

票数 3
EN

Stack Overflow用户

发布于 2011-09-01 23:01:58

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1838989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档