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

标签 c++ linux g++ profiling perf

我正在使用 linux perf 分析一个 C++ 应用程序,并且我使用 GProf2dot 得到了一个很好的控制流图.但是,C 库 (libc6-2.13.so) 中的一些符号占用了总时间的很大一部分,但没有边。

例如:

  • _int_malloc 占用了 8% 的时间,但没有调用 parents。
  • __strcmp_sse42__cxxabiv1::__si_class_type_info::__do_dyncast 一起占用了大约 10% 的时间,并且调用者的名字是 0 ,它有调用者 2d6935c2cc748c 和没有调用者的 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/

相关文章:

linux - "$# -ne 4"在 bash 中是什么意思?

linux - 了解上周有多少用户连接到我的计算机,以及每个用户连接了多少次

c++ - 为什么重新声明 std::cout 会导致段错误?

c++ - 切换模板类型

c++ - 在运行时从 RPN 构造函数可调用对象

Python 命名管道行为

c++ - 如何给作为结构成员的数组赋值?

c++ - 模板化 C++ 对象文件

c++ - 命名空间中的内联函数在 gcc 链接期间生成重复符号

C++ 结构和 "error: ISO C++ forbids declaration of ' .. .' with no type"