代码之家  ›  专栏  ›  技术社区  ›  atv

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

  •  22
  • atv  · 技术社区  · 16 年前

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

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

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

    我用-pg选项编译和链接这两个包,调试级别是o0。 完成/列车测试后,生成gmon.out。然后我这样做:

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

    这里,output显示的是train test中函数的调用图,而不是libtrain中函数的调用图。

    有什么问题吗?

    3 回复  |  直到 14 年前
        1
  •  20
  •   Community Mohan Dere    8 年前

    gprof 不行,你得用 sprof 反而。我发现这些链接很有用:

    第二个链接的摘要:

    1. 在调试(-g)模式下编译共享库(libmylib.so)。没有-PG。
    2. 导出ld_profile_output=`PWD`
    3. 导出ld_profile=libmylib.so
    4. rm-f$ld_profile.profile文件
    5. 执行加载libmylib.so的程序
    6. 查看日志。

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

        2
  •  2
  •   Jim Hunziker    9 年前

    我正在从python加载我的库,但是没有任何运气 sprof . 相反,我用 oprofile ,至少在Fedora存储库中:

    operf --callgraph /path/to/mybinary

    等待应用程序完成或执行ctl-c停止分析。现在,让我们生成概要文件摘要:

    opreport --callgraph --symbols

    documentation 来解释它。有点乱。在生成的报告中,每个符号都列在自己的块中。块的主符号是未缩进的符号。上面的项是调用该函数的函数,下面的项是它调用的对象。下面部分中的百分比是它在这些被调用方中花费的相对时间量。

        3
  •  0
  •   Patrick Schlüter    14 年前

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

    推荐文章