[英]How do I get call parents for libc6 symbols (e.g. _int_malloc) with linux 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
没有呼叫者。 结果,我无法找出仅使用perf负责所有这些分配和动态转换的例程。 但是,似乎其他符号(例如malloc
但没有_int_malloc
)确实具有调用父级。
为什么perf不显示_int_malloc的通话父母? 为什么找不到__do_dyn_cast的最终调用者? 而且,我是否可以通过某种方式修改设置,以便获得此信息? 我使用的是x86-64,所以我想知道是否需要带帧指针的(非标准)libc6。
更新:从3.7.0内核开始,可以使用perf record -gdwarf <command>
确定系统库中符号的调用父级。
使用-gdwarf
,无需使用-fno-omit-frame-pointer
进行编译。
原始答案:是的,目前(2012年5月24日),可能需要在x86_64上使用帧指针( -fno-omit-framepointer
)编译libc6。
但是,开发人员当前正在努力允许perf工具使用DWARF展开信息。 这意味着不再需要帧指针来获取x86_64上的回溯信息。 但是,Linus不希望在内核中放开DWARF。 因此,性能工具将在系统运行时保存寄存器,并使用libunwind库在用户空间性能工具中执行DWARF展开。
已经对该技术进行了测试,可以成功确定(例如) malloc
和dynamic_cast
调用方。 但是,补丁集尚未集成到Linux内核中,因此需要进行进一步的修订才能准备就绪。
从探查器无法识别的例程中调用_int_malloc
和__do_dyn_cast
,因为该例程没有符号表信息。
而且,看起来您正在显示自己的(专有)时间 。 这仅对于在以下情况的例程中找到热点很有用:a)自我时间很多,b)您可以修复。
还有后续原来的UNIX剖析原因profil
创建。 真正的软件由几乎花费所有时间调用其他函数的函数组成,并且您需要能够在很多时间找到堆栈中的代码,而不是在很多时候找到程序计数器。
所以,你需要配置perf
采取堆样品,并告诉你的时间的百分比每个例程是在栈上。 如果它不仅报告例程,还报告代码行,那就更好了,例如Zoom 。 最好在壁钟时间采样,这样您就不会对IO视而不见。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.