You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QEMU运行RISC-V 64位Fedora时获取动态执行轨迹遇阻求助

问题分析与解决方案

1. 修复启动参数的直接错误

你的QEMU启动命令里的-D参数缺少日志文件路径,QEMU需要该参数指定调试日志的输出目标,缺失会导致启动异常。正确写法应为-D qemu_trace.log(替换为你想要的日志文件名)。

2. 解决完整系统下指令追踪的性能瓶颈

直接使用-d cpu在完整Fedora系统中会输出每一条执行的CPU指令,数据量极其庞大,会触发IO瓶颈导致系统卡住。针对完整系统的轨迹获取,建议:

  • 缩小追踪范围:配合QEMU的gdb调试功能,attach到目标进程后再开启追踪,避免全系统指令输出;
  • 降低输出粒度:用-d exec替代-d cpu,仅输出执行的基本块而非单条指令,大幅减少日志量。

3. 用Hello World演示正确的轨迹获取流程

步骤1:编译RISC-V64版本的Hello World

编写hello.c:

#include <stdio.h>
int main() {
    printf("Hello, QEMU RISC-V!\n");
    return 0;
}

用RISC-V交叉编译器编译为静态可执行文件:

riscv64-linux-gnu-gcc -static hello.c -o hello-riscv64

步骤2:用QEMU-user模式快速获取轨迹

QEMU-user模式无需完整虚拟机,直接运行用户程序,适合单个程序的调试:

qemu-riscv64 -d cpu -D hello_trace.log ./hello-riscv64

执行完成后,hello_trace.log文件中就会包含程序执行的每条指令轨迹。

步骤3:(可选)System模式下配合gdb追踪特定代码

如果必须在system虚拟机环境中追踪:

  1. 启动QEMU并开启gdb服务器:
qemu-system-riscv64 -nographic -machine virt -smp 4 -m 4G -kernel <path to elf file> -bios none -drive file=<path to raw file>,format=raw -s -S
  1. 用RISC-V gdb连接并设置断点:
riscv64-linux-gnu-gdb hello-riscv64
(gdb) target remote :1234
(gdb) break main
(gdb) continue
  1. 切换到QEMU监控界面(按Ctrl+A再按c),开启轨迹记录:
logfile qemu_trace.log
cpu on

程序继续执行后,日志会记录main函数及后续的指令轨迹。

额外优化建议

  • 用-d in_asm,cpu可以同时输出汇编指令和CPU状态,更便于分析;
  • 针对大日志文件,可通过grep筛选关键内容,比如grep "main" qemu_trace.log;
  • 若仅需基本块执行轨迹,用-d exec替代-d cpu,日志量会显著降低。

内容的提问来源于stack exchange,提问作者shravan.sukumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 08:58:25