微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c – 如何使用linux perf获取libc6符号(例如_int_malloc)的调用父项?

我正在使用 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进行编译.

原始答案:
是的,目前可能需要在x86_64上使用帧指针(-fno-omit-framepointer)编译的libc6(2012年5月24日).

但是,开发人员目前正在努力允许perf工具使用DWARF展开信息.这意味着不再需要帧指针来获取x86_64上的回溯信息.但是,Linus不希望在内核中使用DWARF开卷器.因此,perf工具将在系统运行时保存寄存器,并使用libunwind库在userspace perf工具中执行DWARF展开.

已经测试了该技术以成功确定(例如)malloc和dynamic_cast的调用者.但是,补丁集尚未集成到Linux内核中,需要在准备好之前进行进一步的修订.

原文地址:https://www.jb51.cc/c/118322.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐