使用 --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 进行性能记录无法展开主函数 的相关文章

  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么

随机推荐

  • 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