使用 qemu-system 记录尽可能多的信息

Logging as many info as possible using qemu-system

我正在尝试使用 qemu 系统模拟一系列 ARM 固件。我从一个覆盆子图像开始进行一些实验,我想知道是否有一种方法可以记录(模拟的)覆盆子 makese(例如系统调用)的每个动作。我现在使用的命令是

sudo qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -dtb versatile-pb.dtb -no-reboot -serial stdio -append "root=/dev/sda2 rootfstype=ext4 rw" -hda rpitest.qcow2 -net nic -net user -net tap,ifname=vnet0,script=no,downscript=no -trace guest_user_syscall,file=trace

但是文件 trace 在执行期间仍然是空的。你有什么建议吗?提前致谢:)

'guest_user_syscall' tracepoint 只被 user-mode 模拟器(qemu-arm)使用,而不被系统模拟器(qemu-system-arm)使用,所以它永远不会触发你的命令行。

一般来说,QEMU 没有一个跟踪系统来记录有关客户机 CPU 正在做什么的所有信息:QEMU 的设计有利于“运行 快速纠正代码”,而不是“提供很多关于 possibly-buggy 代码正在做什么的内省和信息”。可用的设施(按用户方便程度大致排序)是:

  • gdbstub。您可以将了解您的目标架构的远程 gdb 连接到 QEMU 的 gdbstub 并执行所有常见的操作,例如单步执行、设置断点等。通常是调试客户代码的最 'user-friendly' 方式,尤其是在早期启动期间。
  • tracepoints(可通过 -trace 或子选项 of-d 记录)。您会得到设备模型代码等作者认为有用的任何内容,这些代码因设备而异。如果设备模型具有跟踪点(或者您能够添加它们),则对于调试与特定设备交互的来宾代码非常有帮助。
  • -d 调试日志记录选项。大多数情况下,这些都偏向于记录易于记录的内容以及有助于调试 QEMU 本身的内容。您需要了解 QEMU 在幕后做了什么(特别是“翻译时间”和“运行时间”之间的区别)才能正确解释它们,但它们对于弄清楚客户代码在做什么很有用.
  • TCG plugins:这是 QEMU 提供的一个相对较新的功能,您可以在其中编写一个 C 插件来“检测”模拟的来宾代码。从理论上讲,这可以让你做相当复杂的事情,比如对执行的指令进行计数和分类(例如,你可以计算系统调用 insns);然而 API 非常复杂并且仍然有一些明显缺失的部分(例如你不能编写一个跟踪所有内存访问的插件)。