如何使用 QEMU 的简单跟踪后端?

2024-01-17

这是后续this https://stackoverflow.com/questions/37522552/qemu-simple-backend-tracing-dosent-print-anything#comment65639854_37522552问题有更多细节,因为没有人帮忙回答。我克隆了最新的 QEMU 存储库并遵循this https://balau82.wordpress.com/2010/02/28/hello-world-for-bare-metal-arm-using-qemu/为arm-softmmu创建Hello World程序的教程。我使用辅助函数跟踪了 TCG,而不是基本块中的寄存器,但我遇到了跟​​踪功能,我想尝试一下。继文档 http://git.qemu-project.org/?p=qemu.git;a=blob_plain;f=docs/tracing.txt;hb=HEAD,这是取消注释跟踪事件文件后的 /tmp/events 文件。

exec_tb
exec_tb_exit

跟踪事件文件中删除禁用关键字以启用跟踪的部分是:

# TCG related tracing (mostly disabled by default)
# cpu-exec.c
exec_tb(void *tb, uintptr_t pc) "tb:%p pc=0x%"PRIxPTR
exec_tb_nocache(void *tb, uintptr_t pc) "tb:%p pc=0x%"PRIxPTR
exec_tb_exit(void *last_tb, unsigned int flags) "tb:%p flags=%x"

这是我配置和运行 qemu 可执行文件的方式:

./configure --target-list=arm-softmmu --enable-trace-backends=simple

make

./qemu-system-arm -trace events=/tmp/events -M versatilepb -m 256M -nographic -kernel ~/FileName.bin

从 arm-softmmu 目录中,我以这种方式运行简单的跟踪 python 脚本:

./scripts/simpletrace.py trace-events arm-softmmu/trace-*pid* | head

我在这里做错了什么吗?因为我完全没有收到任何信息。即使跟踪后的二进制文件也只是一小行(当然是乱码)。实际上我预计会有足够大的痕迹。


我无法发现你做错了什么,但我可以提供一个最小的独立工作示例,该示例仅适用于一个命令:https://github.com/cirosantilli/linux-kernel-module-cheat/tree/467923860b78bb5d0c787f1433682dfc9c83223a#count-instructions https://github.com/cirosantilli/linux-kernel-module-cheat/tree/467923860b78bb5d0c787f1433682dfc9c83223a#count-instructions

克隆后执行以下操作:

./run -n -- -trace exec_tb,file=trace
./qemu/scripts/simpletrace.py qemu/trace-events trace >trace.txt
wc -l trace

你就会看到痕迹。

For ARM:

./run -a arm -- -trace exec_tb,file=trace

也许这会让你找出问题所在。

Buildroot 所做的确切 QEMU 配置行是:

./configure --target-list="arm-softmmu" --prefix="/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.arm~/hos
t/usr" --interp-prefix=/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.arm~/host/usr/arm-buildroot-linux-uclibcgnueabi/sysroot --cc="/usr/bin/gcc" --host-cc="/usr
/bin/gcc" --python=/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.arm~/host/usr/bin/python2 --extra-cflags="-O2 -I/home/ciro/bak/git/linux-kernel-module-cheat/bu
ildroot/output.arm~/host/usr/include" --extra-ldflags="-L/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.arm~/host/lib -L/home/ciro/bak/git/linux-kernel-module-ch
eat/buildroot/output.arm~/host/usr/lib -Wl,-rpath,/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.arm~/host/usr/lib" --enable-debug --enable-sdl --extra-cflags='-
DDEBUG_PL061=1' --with-sdlabi=2.0

在 QEMU v2.7.0 上,完整的 QEMU 命令是:

./buildroot/output.x86_64~/host/usr/bin/qemu-system-x86_64 -m 128M -monitor telnet::45454,server,nowait -netdev user,hostfwd=tcp::45455-:45455,id=net0 -smp 1  -M pc -append 'root=/dev/vda nopat nokaslr norandmaps printk.devkmsg=on printk.time=y console=ttyS0 init=/poweroff.out' -device edu -device lkmc_pci_min -device virtio-net-pci,netdev=net0 -kernel ./buildroot/output.x86_64~/images/bzImage  -nographic -trace exec_tb,file=trace -drive file='./buildroot/output.x86_64~/images/rootfs.ext2.qcow2,if=virtio,format=qcow2'

我还建议您一开始就不要--enable-trace-backends,这导致后端更加简单,只是将内容吐出到标准输出,从而导致性能损失很大。也尝试一下GDB QEMU起来,应该很容易找出缺少什么。

更新2.11

  • 跟踪事件已移至:accel/tcg/trace-events,如下所示https://github.com/cirosantilli/qemu/commit/8dbff6d3728ff78c4da74d667bb4833edade06aa https://github.com/cirosantilli/qemu/commit/8dbff6d3728ff78c4da74d667bb4833edade06aa
  • 您必须使用生成的trace-events-all 文件,如下所示:https://github.com/cirosantilli/linux-kernel-module-cheat/tree/0c2bd829d47f6815500420789ad765c7a125b54c#count-boot-instructions https://github.com/cirosantilli/linux-kernel-module-cheat/tree/0c2bd829d47f6815500420789ad765c7a125b54c#count-boot-instructions

-d in_asm option

Edit: -d in_asmalone 仅显示翻译块,因此如果一个块被执行多次,则不会显示多次。有一些额外的标志可以使其更加准确,请参阅:qemu 跟踪哪些指令? https://stackoverflow.com/questions/64847254/what-instructions-does-qemu-trace/64876198#64876198

自从我发现这个选项以来,我一直使用它来获取指令列表,而不是更复杂的跟踪后端:跟踪/分析说明 https://stackoverflow.com/questions/2971926/tracing-profiling-instructions/55635387#55635387

我预计性能不会那么好,但如果它对您来说足够好,就像我进行裸机/用户模式模拟时一样,那就去吧。

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

如何使用 QEMU 的简单跟踪后端? 的相关文章

  • 我们可以优化代码来降低功耗吗?

    有没有什么技术可以优化代码以确保更低的功耗 架构是ARM 语言是C 来自 ARM 技术参考网站 ARM11 MPCore 的特性 提高能源效率的处理器 效率包括 准确的分支和子程序返回预测 减少数量 错误的指令获取和 解码操作 使用物理寻址
  • 记录内存访问足迹

    I found mtrace https github com aclements mtrace克莱门茨博士 虽然很有用 但是在我需要的情况下却不能正常工作 我打算使用该记录来了解不同场景下的内存访问模式 有人可以分享相关经验吗 任何建议将
  • 使用 pytest 运行trace.py

    我正在尝试使用trace py跑步时pytest 我知道pytest有自己的覆盖率插件pytest cov但限制 每行执行的次数不可用 不允许我现在使用它 同样对于coverage py 我正在尝试这个命令 python3 4 m trac
  • 通用 ELF 中的重定位(EM:40)

    我尝试从 Ubuntu 交叉编译到Friendly arm 但出现了奇怪的错误 root kevin VirtualBox home kevin Desktop makef make ARCH arm CROSS COMPILE arm n
  • 如何在java中更改Jaeger API的主机和端口

    我们选择使用 Jaeger API 来进行跟踪 在那里 我们使用 docker 在本地设置了 Jaeger 如下所述 sudo docker run d name jaeger p 5775 5775 udp p 6831 6831 udp
  • ARM 汇编 SOS 中的 64 位除法

    我正在计算 16 个 64 位数字相加的平均值 我认为我已经正确完成了所有加法 但现在我需要弄清楚如何将 64 位数字除以 16 但我被困住了 任何帮助都会非常感谢你 到目前为止 这是我的代码 tableSize EQU 16 sum EQ
  • 适用于arm(cortex-m3)的位置独立可执行文件(-pie)

    我正在使用codesourcery g lite 基于gcc4 7 2版本 为stm32 Cortex m3 编程 我希望动态加载可执行文件 我知道我有两个选择 1 可重定位的elf 需要一个elf解析器 2 具有全局偏移寄存器的位置无关代
  • ARM Linux 如何模拟 PTE 的脏位、访问位和文件位?

    As per pgtable 2 level h https git kernel org cgit linux kernel git torvalds linux git tree arch arm include asm pgtable
  • 在 ARM 处理器上执行存储在外部 SPI 闪存中的程序

    我有一个 ARM 处理器 能够与外部闪存芯片连接 写入芯片的是为 ARM 架构编译的程序 可供执行 我需要知道如何将这些数据从外部闪存获取到 ARM 处理器上以供执行 我可以提前运行某种复制例程 将数据复制到可执行内存空间吗 我想我可以 但
  • 小型 ARM 微控制器的 RTOS 内核之间的可量化差异 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有许多不同的 RTOS 可用于微控制器 我专门寻找支持 ARM Cortex M 处理器的 RTOS 另外 我对闭源解决方案不感兴趣 试图从网站
  • ARM Cortex A8 PMNC 读取在启用后也给出 0.. 有什么想法/建议吗?

    MODULE LICENSE GPL MODULE DESCRIPTION user mode access to performance registers int init arm init void unsigned int valu
  • WCF:如何跟踪消息正文?

    我正在尝试诊断在相对简单的服务主机进程 Service exe 中自托管的 WCF 服务 我已这样配置 Service exe config
  • 可以使用Visual Studio 2012构建ARM桌面程序吗?

    我正在使用 Visual Studio 2012 beta 我的桌面 win32 程序在 ARM 架构中编译得很好 升级到 Visual Studio 2012 RC 后 编译器无法工作并出现以下错误 不支持为 ARM 平台编译桌面应用程序
  • 如何在 Android 设备上运行 VS Code [重复]

    这个问题在这里已经有答案了 我有 Galaxy Tab S6 它具有替代笔记本电脑的很酷的功能 例如连接鼠标和键盘 但不幸的是它运行 Android 操作系统 并且没有很多开发应用程序可用于 Android 所以我想是否有一个选项可以在至少
  • Android 模拟器在启动时永远挂起

    模拟器已启动 但未启动进一步的 android 闪烁文本 开始于 Android Sdk emulator emulator Nexus 5X API 25 verbose 日志中仅重复记录 emulator MemoryReport Ep
  • ARM + gcc:不要使用一大块 .rodata 部分

    我想使用 gcc 编译一个程序 并针对 ARM 处理器进行链接时间优化 当我在没有 LTO 的情况下编译时 系统会被编译 当我启用 LTO 时 使用 flto 我收到以下汇编错误 错误 无效的文字常量 池需要更近 环顾网络 我发现这与我系统
  • 如何使用 Neon SIMD 将无符号字符转换为有符号整数

    如何转换变量的数据类型uint8 t to int32 t使用霓虹灯 我找不到执行此操作的任何内在因素 假设您想要将 16 x 8 位整数的向量转换为 4 个 4 x 32 位整数的向量 您可以通过首先解压缩为 16 位 然后再次解压缩为
  • 为什么 i2c_smbus 函数不可用? (I2C——嵌入式Linux)

    有很多参考使用i2c smbus 开发嵌入式 Linux 软件时在 I2C 总线上进行通信的函数 什么时候i2c smbus函数如i2c smbus read word data在软件项目中引用了 ARM8 处理器错误 例如 i2c smb
  • 为什么当大小大于 50 时,该程序花费的时间会呈指数级增长?

    所以我正在为类编写一个 ARM 汇编快速排序方法 我对大部分内容都有了解 除了复杂性没有意义 我们将其与我们制作的另一种冒泡排序方法进行比较 它对于具有 1 个参数和 10 个参数的示例表现更好 然而 我什至无法比较 100 个参数测试 因
  • ARM 系统调用的接口是什么?它在 Linux 内核中的何处定义?

    我读过有关 Linux 中的系统调用的内容 并且到处都给出了有关 x86 架构的描述 0x80中断和SYSENTER 但我无法追踪 ARM 架构中系统调用的文件和进程 任何人都可以帮忙吗 我知道的几个相关文件是 arch arm kerne

随机推荐

  • 字符串replace()和replaceAll()之间的区别

    java lang String 之间有什么区别replace and replaceAll 方法 除了后者使用正则表达式 对于简单的替换 例如替换 with 有什么区别吗 In java lang String https docs or
  • Youtube API V3 Java 任何可能无需调用浏览器上传视频

    嗨 我希望有人可以帮助我 我的本地计算机上有一个 Java 应用程序 我正在尝试将视频上传到 YouTube 将视频上传到经过身份验证的用户的频道 使用 OAuth 2 0 授权请求 效果很好 源代码来自Youtube API V3 类名称
  • 覆盖烧瓶蓝图中的路线

    有一个蓝图 定义了很多有用的路线 但我无法控制它 无法以任何方式更改它的代码 尝试在不同的应用程序中重用它 但蓝图的端点之一必须重载 我怎样才能做到这一点 我尝试在现有路线的基础上添加一条新的蓝图路线 blueprint route my
  • 行背景颜色 GtkTreeView 小部件

    我正在尝试将 gtk 树视图小部件中禁用的行着色为浅灰色 根据我所读到的内容 我应该设置相应 cellrenderer 的 background gdk 属性并将其绑定到模型列 这种作品 Gtk CellRendererText textR
  • 程序化 Jetty 关闭

    如何以编程方式关闭嵌入式jetty服务器 我像这样启动码头服务器 Server server new Server 8090 server start server join 现在 我想根据请求关闭它 例如http 127 0 0 1 80
  • 获取远程文件的最后修改日期

    我想通过curl 获取远程文件的最后修改日期 有谁知道这是怎么做到的吗 你可能可以使用这样做curl getinfo http php net manual en function curl getinfo php
  • Delphi:如何聚合 TClientDataset 中的范围记录?

    我需要使用一些聚合TClient数据集 在 SQL 中 这些聚合可以使用如下脚本完成 Select Sum column1 from table1 where Date Column lt Date Value 因为我在很长的过程和非常慢的
  • Symfony 2 Assetic 致命错误:在资产转储上找不到类“Assetic\Util\PathUtils”

    我将 Symfony 版本 2 1 10 与 Assetic 一起使用 在上次作曲家更新后 当我尝试运行时出现以下错误php app console assetic dump Dumping all dev assets Debug mod
  • 如何增加 vim 中行号边距的间距?

    我的 vim 配色方案有问题 source tinygrab com http new tinygrab com ca56d2c7a8e13f7077012bece6abd90e png 行号与代码太接近 如何增加行号右边距的宽度 这也困扰
  • 如何在 Eloquent ORM laravel 中获取最后一个插入 id

    我正在使用 Eloquent ORM in Laravel 执行数据库操作 我只想获取数据库中最后一次插入的id 不是最大id 我搜索了 laravel Eloquent ORM 中的最后一个插入 id 我得到了以下链接 Laravel 使
  • DataTables 渲染自定义列

    是否可以在 DataTables net 中呈现自定义列 我已经阅读了很多教程和文档 但无法使其正常工作 我想创建带有链接的第三列 我在其中使用第一列中的信息 我的代码如下所示 document ready function categor
  • java 正则表达式:替换 ${var}

    我正在尝试替换一个字符串 例如 Hello my name is name I am age years old with Hello my name is Johannes I am 22 years old 变量存储在 HashMap
  • canvas.toDataURL() 导致安全错误

    我正在使用 HTML5 画布和 toDataURL 功能通过动力学JS http www html5canvastutorials com kineticjs html5 canvas stage data url with kinetic
  • Spring 缓存 - 忽略键的参数

    我想缓存一个具有可选参数 下面示例中的用户代理 的简单 getter 的结果 如何在不考虑可选用户代理参数的情况下指示创建密钥 Cacheable value bookCache public Book getBooks RequestHe
  • 了解可见性:根据 W3C 文档折叠表列

    来自 W3C 的动态行列效果 https www w3 org TR CSS22 tables html dynamic effects 此折叠值会导致整个行或列从显示中删除 并且通常由行或列占用的空间可用于其他内容 从上面我的理解是 如果
  • 如何使用 Indigo 设置 Eclipse PDE/Build?

    在我的项目中 我使用 PDE Build 在 Hudson 的远程服务器上构建我的 RCP 应用程序 当前版本是基于 Eclipse Galileo 的包 它作为构建器应用程序和目标平台都可以正常工作 现在我想将其升级到 Indigo 我需
  • 无法在 Microsoft Powershell 中使用“mvn -D”参数运行 Maven,但可以在命令提示符下运行

    我正在尝试从命令行构建我们的网络项目 但跳过测试 我正在使用命令mvn clean install Dmaven test skip true 当我从传统的黑白命令提示符 又名 DOS shell 运行命令时 该命令有效 但是当我从 Win
  • 直接映射缓存

    直接映射缓存由 16 个块组成 主存包含 16K 块 每个块 8 字节 主存地址格式是什么 意思是每个字段的大小 我知道这些字段是 Tag Block Offset 我只是不知道如何获得每个的尺寸 这是作业吗 为了解决这个问题 您需要知道相
  • Android listview with Glide - 加载后位图加倍

    我正在开发一个安卓应用程序 我的片段之一包含一个简单的列表视图 显示朋友列表 每个朋友都可以有自己的个人资料图片 它是由 Glide 库设置的 当用户没有设置个人资料图片时 将显示默认图像 我的问题是 每次列表中的第一个元素都会获得与列表的
  • 如何使用 QEMU 的简单跟踪后端?

    这是后续this https stackoverflow com questions 37522552 qemu simple backend tracing dosent print anything comment65639854 37