我是Ubuntu 16.04用户。
对于分析c++
程序,我使用perf
工具。所以我跑:
perf record ./myprogram myprogram_args
perf report
现在作为输出我有:
14,52% CSim2Sim libsimgrid.so.3.13.90 [.] lmm_solve
4,40% CSim2Sim libsimgrid.so.3.13.90 [.] lmm_update_modified_set_rec
4,05% CSim2Sim libc-2.23.so [.] _int_malloc
3,30% CSim2Sim libsimgrid.so.3.13.90 [.] simgrid::surf::Model::next_occuring_event_lazy
2,19% CSim2Sim libc-2.23.so [.] _int_free
........................................................................
我只看到程序中的“深度”和库调用。如何获得与此模板类似的perf报告? (像这样):
4,52% CSim2Sim my_function1(int argc, char* argv[])
3,52% CSim2Sim my_function2(int argc, char* argv[])
3,52% CSim2Sim my_function3(int argc, char* argv[])
1,52% CSim2Sim my_function4(int argc, char* argv[])
答案 0 :(得分:4)
从perf越过info:perf到Perf Wiki,最后到Tutorial - Perf Wiki
使用perf注释的源级别分析
...
如果使用 -ggdb 编译应用程序,perf annotate可以生成源代码级别信息。以下代码段显示了在使用此调试信息进行编译时,同样执行noploop的信息量更多。
使用选项-ggdb
进行编译(可能是链接?)应该可以解决问题。
然后,您可以使用perf record
收集运行时信息,稍后使用perf annotate
进行分析。
我刚刚找到Alternatives to gprof [closed]的答案。如果您想获取调用图信息,建议使用gcc的选项-fno-omit-frame-pointer
。因此,根据您希望实现的目标和优化级别,您可能还需要添加此选项。
答案 1 :(得分:2)
我还建议使用gprof(1)。您将-pg
(可能也带有-O
....)传递给gcc
和/或g++
来编译您的C(或C ++)程序(可能会更改一些) CFLAGS
中的CXXFLAGS
或Makefile
。阅读GCC的instrumentation options。