Ben*_*nRI 7 c++ linux profiling g++ perf
我正在使用linux perf分析C++应用程序,我正在使用GProf2dot获得一个很好的控制流程图.但是,来自C库(libc6-2.13.so)的一些符号占用了总时间的很大一部分,但没有内边缘.
例如:
_int_malloc 需要8%的时间,但没有电话父母.__strcmp_sse42和__cxxabiv1::__si_class_type_info::__do_dyncast一同来的时间约10%,并有来电者的名字是0,它有来电2d6935c,2cc748c和6,其中有没有来电.结果,我无法找到哪些例程负责所有这些mallocing和动态转换只使用perf.但是,似乎其他符号(例如malloc但不是_int_malloc)确实有呼叫父母.
为什么没有为_int_malloc显示呼叫父母?为什么我找不到__do_dyn_cast的最终来电者?并且,有什么方法可以修改我的设置,以便我可以获取此信息吗?我在x86-64上,所以我想知道我是否需要带有帧指针的(非标准)libc6.
更新:从3.7.0内核开始,可以使用确定系统库中符号的调用父项perf record -gdwarf <command>.
使用-gdwarf,没有必要编译-fno-omit-frame-pointer.
原始答案:
是的,目前可能需要-fno-omit-framepointer在x86_64上使用框架指针()编译的libc6 (2012年5月24日).
但是,开发人员目前正在努力允许perf工具使用DWARF展开信息.这意味着不再需要帧指针来获取x86_64上的回溯信息.但是,Linus不希望在内核中使用DWARF开卷器.因此,perf工具将在系统运行时保存寄存器,并使用libunwind库在userspace perf工具中执行DWARF展开.
已经测试了该技术以成功地确定(例如)malloc和的呼叫者dynamic_cast.但是,补丁集尚未集成到Linux内核中,需要在准备好之前进行进一步修订.