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

atv*_*atv 23 c debugging profiling gprof sprof

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

  1. 编译时训练包生成libtrain.so
  2. test_train链接到libtrain.so并生成可执行的train-test

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

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

$ gprof -q ./train-test gmon.out
Run Code Online (Sandbox Code Playgroud)

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

可能是什么问题呢 ?

Dan*_*Dan 20

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. sprof PATH-TO-LIB/$ LD_PROFILE $ LD_PROFILE.profile -p> log
  7. 查看日志.

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

  • 太糟糕了,sprof崩溃得很厉害,例如[这个问题](http://stackoverflow.com/questions/6216979/what-is-causing-sprof-to-complain-about-inconsistency-detected-by-ld-so) (2认同)
  • 运行加载库的程序后,运行 sprof 并收到此错误:“ld.so 检测到不一致:dl-open.c: 635: _dl_open: 断言 `_dl_debug_initialize (0, args.nsid)->r_state == RT_CONSISTENT' 失败!” (2认同)

归档时间:

查看次数:

23839 次

最近记录:

8 年,12 月 前