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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (16)

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

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

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

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

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

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

可能是什么问题呢 ?

提问于
用户回答回答于

如果你不在Linux上(就像我在Solaris上一样),你只是运气不好,因为那里没有sprof。如果你有你的库的来源,你可以通过链接一个静态库,并用你的库进行性能分析来解决你的问题。我设法跟踪对共享库的调用的另一种方式是使用truss。有了这个选项,-u [!]lib,...:[:][!]func, ...人们可以很好地了解运行的通话记录。它与分析不完全相同,但在某些情况下可能非常有用。

用户回答回答于

  1. 以debug(-g)模式编译共享库(libmylib.so)。没有-pg。
  2. 导出LD_PROFILE_OUTPUT =`pwd`
  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不确定) - 否则你不会收到任何警告。

扫码关注云+社区