Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C gprof:如何为链接到主程序的共享库中的函数生成调用图_C_Debugging_Profiling_Gprof_Sprof - Fatal编程技术网

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

C gprof:如何为链接到主程序的共享库中的函数生成调用图,c,debugging,profiling,gprof,sprof,C,Debugging,Profiling,Gprof,Sprof,我在Linux环境下工作。我有两个“C”源程序包train和test_train 编译时,train包生成libtrain.so 测试列车链接到libtrain.so并生成可执行列车测试 现在我想用gprof生成一个调用图,它显示主程序中函数的调用序列以及libtrain.so中的函数的调用序列 我正在使用-pg选项编译和链接这两个包,调试级别为o0。 完成/列车测试后,生成gmon.out。那么我会: $ gprof -q ./train-test gmon.out 这里,输出显示train

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

  • 编译时,train包生成libtrain.so
  • 测试列车链接到libtrain.so并生成可执行列车测试
  • 现在我想用gprof生成一个调用图,它显示主程序中函数的调用序列以及libtrain.so中的函数的调用序列

    我正在使用-pg选项编译和链接这两个包,调试级别为o0。 完成/列车测试后,生成gmon.out。那么我会:

    $ gprof -q ./train-test gmon.out
    
    这里,输出显示train test中函数的调用图,但不显示libtrain.so中函数的调用图


    有什么问题吗

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

    第二个链接的摘要:

  • 在调试(-g)模式下编译共享库(libmylib.so)。否-pg
  • 导出LD_PROFILE_输出=`pwd`
  • 导出LD_PROFILE=libmylib.so
  • rm-f$LD_PROFILE.PROFILE
  • 执行加载libmylib.so的程序
  • sprof PATH-TO-LIB/$LD_PROFILE$LD_PROFILE.PROFILE-p>log
  • 看日志
  • 我发现在第2步中,它必须是一个现有目录——否则会得到一个有用的警告。在步骤3中,您可能需要将库指定为
    libmylib.so.X
    (甚至可能
    .X.Y
    ,不确定)--否则您将不会得到任何警告。

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

    我正在从Python加载我的库,没有任何运气使用
    sprof
    。相反,我使用了Fedora存储库中的
    oprofile
    ,至少:

    operf--callgraph/path/to/mybinary

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

    opreport--callgraph--symbols


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

    值得注意的是,通常您可以通过在应用程序上运行
    ldd
    计算出二进制文件试图加载的库的名称(mylib.so vs mylib.so.1 vs mylib.so.1.1等)。仅当库通过直接dlopen调用打开时,才应该没有条目。太糟糕了,sprof崩溃非常严重,例如,如果为我的项目选择的编译器MinGW没有提供sprof,该怎么办?运行加载库的程序后,运行sprof并出现以下错误:ld.so:dl open.c:635:_dl\u open:Assertion`\u dl\u debug\u initialize(0,args.nsid)->r\u state==RT\u CONSISTENT'失败!"