我正在使用 linux perf 分析一个 C++ 应用程序,并且我使用 GProf2dot 得到了一个很好的控制流图.但是,C 库 (libc6-2.13.so) 中的一些符号占用了总时间的很大一部分,但没有边。
例如:
_int_malloc
占用了 8% 的时间,但没有调用 parents。__strcmp_sse42
和__cxxabiv1::__si_class_type_info::__do_dyncast
一起占用了大约 10% 的时间,并且调用者的名字是0
,它有调用者2d6935c
、2cc748c
和没有调用者的6
。
因此,我无法仅使用 perf 找出哪些例程负责所有这些分配和动态转换。但是,似乎其他符号(例如 malloc
而不是 _int_malloc
)确实有调用父项。
为什么 perf show 不为 _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 unwind 信息。这意味着不再需要帧指针来获取 x86_64 上的回溯信息。然而,Linus 不想在内核中使用 DWARF 展开器。因此,perf 工具将在系统运行时保存寄存器,并使用 libunwind 库在用户空间 perf 工具中执行 DWARF 展开。
此技术已经过测试,可以成功确定(例如)malloc
的调用者和 dynamic_cast
.不过,该补丁集目前还没有集成到Linux内核中,需要进一步修改才能准备就绪。
关于c++ - 如何使用 linux perf 获取 libc6 符号(例如 _int_malloc)的调用父项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10213334/