为什么 ls 的这些指令数相差如此之大? (ptrace vs perf vs qemu)

2024-02-12

我想统计运行 /bin/ls 时执行的指令总数。 我使用了 3 种方法,其结果差异很大,我不知道为什么。

1. 使用 ptrace 进行指令计数

我编写了一段代码,调用 ls 的实例并使用 ptrace 单步执行它:

#include <stdio.h>
#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/user.h>
#include <sys/reg.h>    
#include <sys/syscall.h>

int main()
{   
    pid_t child;
    child = fork(); //create child
    
    if(child == 0) {
        ptrace(PTRACE_TRACEME, 0, NULL, NULL);
        char* child_argv[] = {"/bin/ls", NULL};
        execv("/bin/ls", child_argv);
    }
    else {
        int status;
        long long ins_count = 0;
        while(1)
        {
            //stop tracing if child terminated successfully
            wait(&status);
            if(WIFEXITED(status))
                break;

                ins_count++;
                ptrace(PTRACE_SINGLESTEP, child, NULL, NULL);
        }

    printf("\n%lld Instructions executed.\n", ins_count);

    }
    
    return 0;
}

运行此代码会执行 516.678 条指令。

2.QEMU单步执行

我在单步模式下使用 qemu 模拟了 ls,并使用以下命令将所有传入指令记录到日志文件中:qemu-x86_64 -singlestep -D 日志文件 -d in_asm /bin/ls

根据 qemu ls 执行 16.836 条指令。

3. perf

sudo perf stat ls

该命令执行了 8.162.180 条指令。

我知道这些指令大部分来自动态链接器,并且对它们进行计数是很好的。但为什么这些数字相差如此之大呢?它们不应该都是一样的吗?


你用qemu计算指令数的方法是错误的,in_asm选项只显示编译块中的翻译指令,因此在 qemu 中进行 tb 链接处理后,它会直接跳转到翻译块,导致 qemu 中的计数少于其他工具,因此实践中的一个好方法是-d nochain,exec with -singlestep选项。

不过,这些工具之间也存在指令数差异,我尝试过在不同目录中运行 qemu 来生成这些日志,qemu guest 程序是静态链接的,日志文件在计算指令数时显示不同的结果,可能是某些 glibc 启动或者 init 的东西参与环境参数来导致这种差异。

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

为什么 ls 的这些指令数相差如此之大? (ptrace vs perf vs qemu) 的相关文章

  • 如何从RichTextBox中获取显示的文本?

    如何获得显示的RichTextBox 中的文本 我的意思是 如果 RichTextBox 滚动到末尾 我只想接收那些对我来说可见的行 P S 获得第一个显示的字符串就足够了 您想使用 RichTextBox GetCharIndexFrom
  • 将图像文件从网址复制到本地文件夹?

    我有该图像的网址 例如 http testsite com web abc jpg http testsite com web abc jpg 我想将该 URL 复制到 c images 中的本地文件夹中 而且当我将该文件复制到文件夹中时
  • 键盘加速器在 UWP 应用中停止工作

    我正在尝试将键盘加速器添加到 UWP 应用程序中的 CommandBar 菜单项 当应用程序启动时 这工作正常 但在我第一次打开溢出菜单后 加速器停止工作 这似乎不会发生在主要命令 菜单之外 上 只有溢出菜单内的辅助命令才会发生 此外 单击
  • 是否允许将类模板类型参数键入相同的名称?

    这似乎可以在 MSVC 中按预期编译甚至工作 但它是合法的 C 代码吗 它是否能保证执行此处所期望的操作 即将模板类型导出到结构体的同名用户 template
  • 用户控件内所有控件均为空

    我有一个 UserControl 它使用 UserControl 以及其他控件 In the ascx文件我有以下代码
  • 静态类变量与外部变量相同,只是具有类作用域吗?

    在我看来 静态类变量与外部变量相同 因为你只需要declare它在static int x extern int x语句 并在其他地方实际定义它 通常在 cpp 文件中 静态类变量 h file class Foo static int x
  • /proc/PID 文件格式

    我想从中检索一些流程信息 proc目录 我的问题如下 中的文件是否有标准格式 proc PID 例如 有这个proc PID status文件与Name t ProcName在第一行 我可以在其他地方用空格代替这个文件吗 t或者类似的东西
  • 如何在编译C代码时禁用警告?

    我正在使用 32 位 Fedora 14 系统 我正在使用编译我的源代码gcc 有谁知道如何在编译c代码时禁用警告 EDIT 是的 我知道 最好的办法是修复这些警告以避免任何未定义 未知的行为 但目前在这里 我第一次编写了巨大的代码 并且在
  • Paradox 表 - Oledb 异常:外部表不是预期的格式

    我正在使用 Oledb 从 Paradox 表中读取一些数据 我遇到的问题是 当我将代码复制到控制台应用程序时 代码可以工作 但在 WinForms 中却不行 两者都以 x86 进行调试 我实际上只是复制代码 在 WinForms 应用程序
  • 有没有办法使用 i387 fsqrt 指令获得正确的舍入?

    有没有办法使用 i387 fsqrt 指令获得正确的舍入 除了改变精确模式在 x87 控制字中 我知道这是可能的 但这不是一个合理的解决方案 因为它存在令人讨厌的重入型问题 如果 sqrt 操作中断 精度模式将出错 我正在处理的问题如下 x
  • 是否有像 gccxml 这样的用于生成包装器的 C 标头解析器工具?

    我需要为一种新的编程语言编写一些 C 标头包装器 并且想要类似 gccxml 的东西 但不完全依赖 gcc 以及它在 Windows 系统上带来的问题 只需要读C而不是C 只要有完整的文档记录 任何格式的输出都可以 Linux Solari
  • 退出 bash 脚本但保持进程运行

    我正在运行服务器 需要使用参数执行以下命令 这些脚本目前工作得很好 但问题是当我运行脚本时我无法返回到控制台 它在控制台中保持运行 如果我强行停止它 那么该过程也会停止 我想继续运行该进程并返回到控制台 bin sh php home st
  • 在 MATLAB 中创建共享库

    一位研究人员在 MATLAB 中创建了一个小型仿真 我们希望其他人也能使用它 我的计划是进行模拟 清理一些东西并将其变成一组函数 然后我打算将其编译成C库并使用SWIG https en wikipedia org wiki SWIG创建一
  • 操纵 setter 以避免 null

    通常我们有 public string code get set 如果最终有人将代码设置为 null 我需要避免空引用异常 我尝试这个想法 有什么帮助吗 public string code get set if code null cod
  • 更改 IdentityServer4 实体框架表名称

    我正在尝试更改由 IdentityServer4 的 PersistedGrantDb 和 ConfigurationDb 创建的默认表名称 并让实体框架生成正确的 SQL 例如 而不是使用实体IdentityServer4 EntityF
  • 在简单注入器中注册具有多个构造函数和字符串依赖项的类型

    我正在尝试弄清楚如何使用 Simple Injector 我在项目中使用了它 注册简单服务及其组件没有任何问题 但是 当组件具有两个以上实现接口的构造函数时 我想使用依赖注入器 public DAL IDAL private Logger
  • 不兼容的类型 - 是因为数组已经是指针吗?

    在下面的代码中 我创建一个基于书籍结构的对象 并让它保存多个 书籍 我设置的是一个数组 即定义 启动的对象 然而 每当我去测试我对指针的了解 实践有帮助 并尝试创建一个指向创建的对象的指针时 它都会给我错误 C Users Justin D
  • 相当于 C# 中 Java 的“ByteBuffer.putType()”

    我正在尝试通过从 Java 移植代码来格式化 C 中的字节数组 在 Java 中 使用方法 buf putInt value buf putShort buf putDouble 等等 但我不知道如何将其移植到 C 我尝试过 MemoryS
  • 如何获取 QIcon 的文件/资源​​路径

    假设我做了这样的事情 QIcon myIcon resources icon ico 我稍后如何确定该图标的路径 例如 QString path myIcon getPath 问题是 没有getPath 会员 我找不到类似的东西 但肯定有办
  • c# 模拟 IFormFile CopyToAsync() 方法

    我正在对一个异步函数进行单元测试 该函数将 IFormFile 列表转换为我自己的任意数据库文件类列表 将文件数据转换为字节数组的方法是 internal async Task

随机推荐

  • JavaFX 透明窗口仅接收绘制像素上的鼠标事件

    我想要一个与屏幕大小相同的舞台 它完全透明并可以在任何地方接收鼠标事件 在下面的示例中 仅当鼠标位于圆圈上方时我才会收到鼠标事件 我在使用 Java 8u11 的 Windows XP 和 Windows 7 上看到此问题 import j
  • += 对不存在的数据帧进行操作

    df 对 city1 city2 0 sfo yyz 1 sfo yvr 2 sfo dfw 3 sfo ewr df pairs to dict records 的输出 city1 sfo city2 yyz city1 sfo city
  • 为什么左值引用和右值引用都可以绑定到函数?

    考虑以下代码 using flref int double using frref int double int foo double return 32 int main flref l foo Function lvalue refer
  • 使用空格传递计算路径

    我在这里尝试一些非常简单的事情 但无法弄清楚我哪里出错了 我发现了许多其他有用的讨论 特别是在这里 https stackoverflow com a 8468690 33682 但还没有找到任何涵盖我的特定场景的内容 在 powershe
  • 对于非指针类型,使用 static_cast 而不是 C 风格转换有什么优势吗?

    我很清楚使用的优势static cast而不是指针类型的 C 风格转换 如果指针类型不兼容 则 static cast将在源代码中的特定行产生编译时错误 C 风格转换可能会在程序执行过程中的 随机 点导致运行时错误 但我无法找到非指针类型的
  • 将环境变量转换为json文件

    我正在尝试找到一种方法将配置设置提供给在容器中运行的 SPA 应用程序 我当前的计划是将配置作为环境变量传递 然后在容器启动时 从这些环境变量生成一个 json 文件以传递到浏览器 以及 SPA 应用程序 我计划像这样格式化我的环境变量 E
  • 如何获取cloudformation中的安全组列表

    我想获取与 cloudformation 参数部分中的特定 VPC 关联的安全组列表 VpcId Description Choose the VPC ID Type AWS EC2 VPC Id SecurityGroupsID Desc
  • getModifiers() 方法如何计算多个修饰符的值?

    Java 文档用于获取修饰符 http docs oracle com javase 7 docs api java lang reflect Member html getModifiers 28 29如下 int getModifier
  • 检索模板中的 json 值

    我从一个表中查询了以下对象 然后将各种对象放入以下 objarr 中 如何在 javascript 中的 UI 中检索这些值 from django core serializers import serialize json serial
  • Java ArrayList 由一个抽象类和任何扩展它的东西组成?

    我知道这是一个基本问题 但我找不到其他 StackOverflow 帖子或任何关于此的好的 API 文档 假设我有一个像这样的抽象类Appliance然后我有一些课程 比如Toaster and Blender延伸Appliance 现在假
  • css中可以使用多个伪元素吗?

    我想制作一个菜单 其中每个项目都用 分隔 为了实现这一点 我使用 menu li before content 这很膨胀 但它也会在第一个项目之前生成一个点 因此 我想使用 first child伪类也是如此 我可以这样做吗 你当然可以 h
  • 如何从 jQuery UI 选项卡内部打开链接

    首先 我查看了这个问题 https stackoverflow com questions 1659852 jquery ui tabs open link inside tab via ajax这不是同一个问题 最终 我试图允许带有打开的
  • 如何让 jQuery 获取图像大小(以字节为单位),而不是图像尺寸?

    我正在使用 jQuery 1 7 1 在浏览器窗口中加载图像后 我想检索其总字节大小 是否有对象名称 值 不 您无法使用 jQuery 或纯 JavaScript 获取图像大小 唯一的方法是使用ajax从服务器端获取它 您可以获取图像 ur
  • 直接切球后... 是什么意思?

    什么是 在 Go 中 这意味着什么 ids append ids index ids index 1 我读过这个很棒的问答 三个点 称为通配符 是否包含多个含义 https stackoverflow com questions 24340
  • java.io.NotSerializedException:sun.nio.fs.WindowsPath - 如何修复它?

    我编写了一个简单的序列化函数来存储 fileTree 表示 基于复合模式 但总是出现以下错误 java io NotSerializableException sun nio fs WindowsPath 不幸的是 到目前为止我还不知道如何
  • 如何提高 SSE 和 AVX 的编译性能?

    我的新 PC 配备 Core i7 CPU 我正在运行基准测试 包括使用 AVX 指令的较新版本 我已经安装了 Visual Studio 2013 以使用较新的编译器 因为我的上一个编译器无法完全编译完整的 SSE SIMD 操作 下面是
  • 如何在node.js中访问localStorage?

    我尝试在网络上搜索可以访问客户端本地存储的节点模块 但找不到任何内容 有人知道其中一个吗 您可以使用 node localstorage要使用的 npm 模块localStorage at the nodejs questions tagg
  • 将 .net 日期转换为 Java 日期

    在我的代码中 我收到格式如下的日期 Date 82135555200000 0800 如何在 Java 中将其解析为 Java 日期 In the string Date 82135555200000 0800 使用这行代码从String
  • 如何检查 nginx gzip_static 模块是否正常工作?

    如何检查 nginx 是否正在提供 gz 版本的静态文件 如果存在 我使用 gzip 静态模块编译了 nginx 但我的日志中没有看到任何提及 gz 版本的信息 我已缩小 global js 和 global css 文件 并在同一目录中使
  • 为什么 ls 的这些指令数相差如此之大? (ptrace vs perf vs qemu)

    我想统计运行 bin ls 时执行的指令总数 我使用了 3 种方法 其结果差异很大 我不知道为什么 1 使用 ptrace 进行指令计数 我编写了一段代码 调用 ls 的实例并使用 ptrace 单步执行它 include