使用 --call-stack fp 进行性能记录无法展开主函数

2023-12-02

我有一个 C++ 测试程序,可以让 CPU 保持忙碌:

#include <cstdint>
#include <iostream>

// Linear-feedback shift register
uint64_t lfsr1(uint64_t max_ix)
{
    uint64_t start_state = 0xACE1u;  /* Any nonzero start state will work. */
    uint64_t lfsr = start_state;
    uint64_t bit;                    /* Must be 16-bit to allow bit<<15 later in the code */

    for (uint64_t ix = 0; ix < max_ix; ++ix)
    {   /* taps: 16 14 13 11; feedback polynomial: x^16 + x^14 + x^13 + x^11 + 1 */
        bit = ((lfsr >> 0) ^ (lfsr >> 1) ^ (lfsr >> 3) ^ (lfsr >> 4)) & 1 /* & 1u */;
        lfsr = (lfsr >> 1) | (bit << 15);
    }
    return lfsr;
}

int main() {
    std::cout << lfsr1(1717986914ull) << "\n";
}

我用它编译g++ -g -O3 -fno-omit-frame-pointer cpu.cpp -o cpu.bin,然后运行它perf record -F 100 --call-graph fp -- ./cpu.bin第二次与dwarf代替fp.

In the perf script输出为fp, 我可以看到

cpu.bin 23435 1535437.021156:   42706947 cycles: 
            5617daf4b7a1 main+0x31 (…/cpu.bin)
            7f9a95088bf7 __libc_start_main+0xe7 (/lib/x86_64-linux-gnu/libc-2.27.so)
         3fe258d4c544155 [unknown] ([unknown])

而对于dwarf, it's

cpu.bin 23443 1535441.101859:   42952079 cycles: 
            55a3b4ffd7a1 lfsr1+0x31 (inlined)
            55a3b4ffd7a1 main+0x31 (…/cpu.bin)
            7f00bcc8ebf6 __libc_start_main+0xe6 (/lib/x86_64-linux-gnu/libc-2.27.so)
            55a3b4ffd829 _start+0x29 (…/cpu.bin)

看起来也许fp相差一个字节__libc_start_main这会导致它错过最后的展开步骤。如何解决这个问题?


正如 Peter 在评论中所说,当使用带有帧指针的 glibc 版本时,问题会自行解决。在 Ubuntu 20.04 上,有一个带有这样的 glibc 的软件包。

sudo apt install libc6-prof
# To use this library:
env LD_LIBRARY_PATH=/lib/libc6-prof/x86_64-linux-gnu perf record …

然后,[unknown]决心_start正如预期的那样。

Source: https://bugs.launchpad.net/ubuntu/+source/glibc/+bug/1908307

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 --call-stack fp 进行性能记录无法展开主函数 的相关文章

随机推荐

  • iOS 8.3 中的 UIDatePicker 内存泄漏

    当在运行 IOS 8 3 的 iPad 上的弹出窗口中使用 UIDatePicker 时 我发现内存泄漏 每次弹出日期选择器然后关闭时 我都会在多次内存泄漏中得到大约 5K 的信息 泄漏的对象是 NSDateComponents 负责的框架
  • Boost:反序列化通过 ZeroMQ 拉套接字传递的自定义 C++ 对象

    我在这里写的文字是我之前在另一个线程中打开的后续问题Boost 序列化 反序列化通过 ZeroMQ 拉套接字传递的自定义 C 对象 早期线程中的编译问题已通过使用文本存档类型而不是二进制存档解决 但现在我在反序列化时遇到运行时问题 为了您的
  • 以字符串形式接收数字(uart)

    我正在尝试通过 uart 接收一个包装为字符串的数字 我发送数字 1000 所以我得到 4 个字节 空字符 但是 当我使用 atoi 将数组转换为数字并将整数与 1000 进行比较时 我并不总是得到正确的数字 这是我用于接收号码的中断处理函
  • 如何在打字稿中使用 jquery ui 和 commonjs

    为了获得更多上下文 我决定将所有模块保留为 commonjs 格式以实现可移植性 并使用 browserify 和其他一些东西来捆绑前端的东西 我使用 TypeScript 进行类型检查 但我不确定如何在我的配置中使用 jquery ui
  • 如何创建随机 3D 矩阵?

    有没有办法随机创建 3D 矩阵 有多种方法可以使用以下方法创建随机二维矩阵randint功能 有没有类似的内置功能 例如 使用以下命令可以轻松生成 4x4 矩阵randint功能 如果我想创建一个 4x4x3 维度的矩阵怎么办 您可以使用r
  • Struts逻辑:迭代输入字段

    我目前有以下代码 数据显示良好
  • PHP strtotime 对于小于 1900 的日期返回 false

    我知道这个问题很受欢迎 在这里问PHP strtotime 对于未来的日期返回 false 和这里如何在 PHP 中处理 1900 年之前的日期 您能否确认我的选择 升级到64位架构 将 strtotime 调用替换为 DateTime D
  • 如何在WinForms系统菜单中显示带有图标和文本的菜单项

    在调整的同时answer of ygoe 我发现可以向菜单添加图标 我尝试并成功地通过将此代码用于纯文本项目来做到这一点 var item new MenuItemInfo cbSize uint Marshal SizeOf typeof
  • HTML textarea:使用 JavaScript 获取换行文本?

    如果我有一个像这样的文本区域
  • 只读取txt文件中给定的最后x行[重复]

    这个问题在这里已经有答案了 目前我正在使用 File ReadAllText 读取文件内容 但现在我需要读取 txt 文件中的最后 x 行 我怎样才能做到这一点 内容myfile txt line1content line2content
  • 如何在 tensorflow.js 模型中添加图像并针对给定图像标签训练模型

    我们使用 TensorFlow js 来创建和训练模型 我们使用 tf fromPixels 函数将图像转换为张量 我们想要创建一个具有以下属性的自定义模型 AddImage HTML Image Element Label 添加带有自定义
  • JqG​​rid addJSONData + ASP.NET 2.0 WS

    我有点失落 我尝试实现一个基于 JqGrid 的解决方案 并尝试使用函数作为数据类型 我猜我已经按照书本设置了所有内容 我调用了 WS 并返回了 JSON 我在 ajax 调用中在客户端取得了成功 并且我使用 绑定 jqGridaddJSO
  • 发送 AJAX 结果但继续在 PHP 中处理

    我正在使用 AJAX 更新数据库中的一些值 一切都工作得很好 但现在我想实现一些日志记录的东西 日志记录功能看起来需要花费相当多的处理时间 并且用户没有理由必须等待它们完成才能看到 AJAX 结果 因此 我正在尝试找到一种方法来发送 AJA
  • 如何在Java中读取同一行的多个输入?

    因此 我尝试使用扫描仪读取一行中的所有输入 然后获取值并找到第二大值 我会使用一个数组BUT我不被允许 您应该输入 10 个整数 按 Enter 键并计算它们 像这样的事情 10 20 30 40 50 60 70 80 90 100 EN
  • 在 C 程序中使用 _ 和 __ [重复]

    这个问题在这里已经有答案了 我正在读K R的书 我读 仅供标准库函数使用的名称 首先 所以它们不太可能与中的名称发生冲突 用户程序 这到底是什么意思 请解释一下真正简单实用的方法 我的理解是 如果我想使用 math h 中定义的 sqrt
  • 无法从根提供程序 .Net Core 2 解析范围服务

    当我尝试运行我的应用程序时 出现错误 InvalidOperationException Cannot resolve API Domain Data Repositories IEmailRepository from root prov
  • Slick:具有左连接的查询中的动态排序

    这是一个源自于的问题另一个问题 我需要能够动态传递要在具有左连接的 Slick 查询中排序的列 在这种特殊情况下的问题是左连接表变得可选 我不知道如何处理它 如果我做桌子Company不是可选的我得到SlickException Read
  • 如何修改出站 CXF 请求的原始 XML 消息?

    我想修改传出的 SOAP 请求 我想从信封主体中删除 2 个 xml 节点 我设法设置了一个拦截器 并将生成的消息集的字符串值获取到端点 但是 以下代码似乎不起作用 因为传出消息未按预期进行编辑 有没有人有一些关于如何做到这一点的代码或想法
  • 使用 htaccess 删除目录后的尾部斜杠

    我想删除 当我想访问子目录文件夹中的索引文件时 例如 www example com test dashboard to www example com test dashboard 我试过这个 RewriteEngine On Remov
  • 使用 --call-stack fp 进行性能记录无法展开主函数

    我有一个 C 测试程序 可以让 CPU 保持忙碌 include