# rvtrace **Repository Path**: twohaha/rvtrace ## Basic Information - **Project Name**: rvtrace - **Description**: 用于跟踪RISC-V程序指令序列的QEMU插件 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2023-08-15 - **Last Updated**: 2024-04-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # RVTRACE:用于RISC-V程序指令追踪的QEMU插件 本插件完整记录了RISC-V程序执行的指令序列,并提供了一系列指令序列分析应用。 ## 目录结构 ``` . ├── app #指令序列分析应用 ├── src #rvtrace源代码 ├── doc #文档 ├── include ├── lib ├── plugins #用于编译插件的目录 ├── plugins.sh #插件目录生成脚本 ├── build.sh #应用编译脚本 └── README.md ``` ## 编译QEMU 从源码构建QEMU: ```shell $ cd /path/to/qemu $ mkdir build $ cd build $ ../configure --target-list=riscv64-linux-user --enable-plugins $ make -j ``` 如果之前已经编译过QEMU则无需重新编译。 目前已测试的QEMU版本包括: - 7.0.0 - 7.2.5 ## 编译rvtrace插件 rvtrace插件需要在QEMU的编译环境下进行。 ### 方法1:直接编译 1. 在rvtrace目录下运行 plugins.sh,编译 QEMU 插件所需要的文件会拷贝至 rvtrace/plugins 目录下。 2. 将rvtrace目录拷贝到qemu/build/目录下。 3. 在qemu/build/rvtrace/plugins/目录下运行make。 4. 检查librvtrace.so是否编译成功。 ```shell $ ./plugins.sh $ cp /path/to/rvtrace /path/to/qemu/build -r $ cd /path/to/qemu/build/rvtrace/plugins $ make $ pwd /path/to/qemu/build/rvtrace/plugins $ ls librvtrace.so librvtrace.so ``` ## 运行指令追踪 运行 QEMU,记录翻译块的信息和序列。 ```shell $ /path/to/qemu/build/qemu-riscv64 -plugin /path/to/qemu/build/rvtrace/plugins/librvtrace.so,output_id=y hello Hello world $ ls total_insn_count.txt rvtrace.txt rv_id_sequence.bin ``` - total_insn_count.txt: 保存了执行指令的总数 - rvtrace.txt: 保存了指令序列的原始信息 - rv_id_sequence.bin:翻译块ID序列 ### 插件支持的可先参数 #### output_id rv_id_sequence.bin 文件数据很多,分析时可能不需要。增加 output_id 选项来控制记录和输出翻译块ID的执行序列。 默认是关闭的。 ```shell $ /path/to/qemu/build/qemu-riscv64 -plugin /path/to/qemu/build/rvtrace/plugins/librvtrace.so,output_id=y hello Hello world ``` #### hint 插件支持使用 hint 指令作为开关,追踪程序某段感兴趣的代码的执行情况。 例如 example.c 的代码,rvtrace 只会追踪 `asm("addi x0,x0,1");` 和 `asm("addi x0,x0,2");` 之间的代码。 ```c /* example.c */ void a() { ... }; void b() { ... }; int main(void) { asm("addi x0,x0,1"); /* 开启追踪的 hint 指令 */ a(); asm("addi x0,x0,2"); /* 关闭追踪的 hint 指令 */ b(); return 0; } ``` ```shell $ /path/to/qemu/build/qemu-riscv64 -plugin /path/to/qemu/build/rvtrace/plugins/librvtrace.so,hint=y example ``` ## 分析指令序列 运行build.sh,编译指令序列分析应用。 build目录下会生成一系列应用。 目前支持的应用包括: - insn_count: 各个指令的条数统计 - insn_classify.c: 按类别统计指令数 - hotblock: 寻找热点翻译块 - program_behavior_analysis: 分析程序运行时特征 ### 指令条数统计 ```shell $ ./build/insn_count /path/to/rvtrace.txt ``` 输出文件:insn_count.txt ```shell 0 lbu 5229 1 bne 4156 2 c.addi 3712 3 c.bnez 3171 4 c.mv 2894 5 addi 2219 6 beq 1824 7 c.beqz 1818 8 ld 1795 9 c.addiw 1520 10 slliw 1124 11 add 1080 12 c.ld 819 13 c.sdsp 577 14 c.or 564 ... ``` ## 贡献者 - Xiaoxiao Qin (xiaoxiaoqin0@qq.com) - Xuezheng Xu (xuezhengxu@126.com)