我是spike和RISC V的新手。我正在尝试使用spike进行一些动态指令跟踪。这些说明来自 example.c 文件。我尝试过以下命令:
$ riscv64-unknown-elf-gcc simple.c -g -o simple.out
$ riscv64-unknown-elf-objdump -d --line-numbers -S simple.out
但是这些命令在输出文件中显示汇编的指令,这不是我想要的。我需要在运行时跟踪动态执行的指令。我发现在spike主机选项中只有两个相关命令:
-g
- 跟踪 PC 的直方图-l
- 生成执行日志
我不确定结果是否是我上面所期望的。 有谁知道如何在尖峰中进行动态指令跟踪? 非常感谢!
最佳答案
是的,您可以使用-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来进入 Debug模式。然后,您可以在程序中感兴趣的第一条指令上设置断点(直到 pc 0 YOURADDRESS
- 在 objdump 输出中查找地址)并从那里单步执行(通过多次按 return)。另请参阅帮助屏幕,方法是在尖峰提示符处输入 h。
关于runtime - 如何跟踪尖峰中的动态指令(在 RISC-V 上),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60756100/