繁体   English   中英

我如何在Linux性能下获得libc6符号(例如_int_malloc)的致电父母?

[英]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 ,其中呼叫者2d6935c2cc748c6没有呼叫者。

结果,我无法找出仅使用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展开。

已经对该技术进行了测试,可以成功确定(例如) mallocdynamic_cast调用方。 但是,补丁集尚未集成到Linux内核中,因此需要进行进一步的修订才能准备就绪。

从探查器无法识别的例程中调用_int_malloc__do_dyn_cast ,因为该例程没有符号表信息。

而且,看起来您正在显示自己的(专有)时间 这仅对于在以下情况的例程中找到热点很有用:a)自我时间很多,b)您可以修复。

还有后续原来的UNIX剖析原因profil创建。 真正的软件由几乎花费所有时间调用其他函数的函数组成,并且您需要能够在很多时间找到堆栈中的代码,而不是在很多时候找到程序计数器。

所以,你需要配置perf采取堆样品,并告诉你的时间的百分比每个例程是在栈上。 如果它不仅报告例程,还报告代码行,那就更好了,例如Zoom 最好在壁钟时间采样,这样您就不会对IO视而不见。

关于这一切还有更多要说的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM