如何跟踪尖峰中的动态指令(在 RISC-V 上)

How to trace dynamic instruction in spike (on RISC-V)

我是 spike 和 RISC V 的新手。我正在尝试使用 spike 进行一些动态指令跟踪。这些说明来自 sample.c 文件。我尝试了以下命令:

$ riscv64-unknown-elf-gcc simple.c -g -o simple.out
$ riscv64-unknown-elf-objdump -d --line-numbers -S simple.out

但是这些命令在输出文件中显示汇编指令,这不是我想要的。我需要在运行时跟踪动态执行的指令。我在 spike 主机选项中只找到两个相关命令:

我不确定结果是否如我所期望的那样。 有谁知道如何在 spike 中进行动态指令跟踪? 非常感谢!

是的,您可以使用 -l 调用 spike 来跟踪所有已执行的指令。

示例:

$ spike -l --isa=RV64gc ~/riscv/pk/riscv64-unknown-elf/bin/pk ./hello 2> ins.log

请注意,此跟踪还包含代理内核执行的所有指令 - 而不仅仅是您的用户程序的跟踪。

跟踪仍然有用,例如您可以搜索代码的起始地址(即在 objdump 输出中查找)并从那里使用跟踪。

此外,当您的程序调用系统调用时,您会在跟踪中看到类似这样的内容:

[.. inside your program ..]
core   0: 0x0000000000010088 (0x00000073) ecall
core   0: exception trap_user_ecall, epc 0x0000000000010088
core   0: 0x0000000080001938 (0x14011173) csrrw   sp, sscratch, sp
[.. inside the pk ..]
sret
[.. inside your program ..]

这意味着您可以通过搜索下一个 sret 跳到 sycall 指令(在 pk 中执行)。

或者,您可以使用 -d 调用 spike 以进入调试模式。然后,您可以在程序中感兴趣的第一条指令上设置断点(until pc 0 YOURADDRESS - 在 objdump 输出中查找地址)并从那里单步执行(通过多次点击 return)。另请在尖峰提示符下输入 h 查看帮助屏幕。