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

标签 runtime trace riscv spike

我是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/

相关文章:

algorithm - 关于对数的大 O 表示法

python - 尝试注销 django 时出现运行时错误

c - mlockall 的这种用法正确吗?

ios - 是否可以跟踪 UIView 框架的更改?

qemu - 谁在 qemu-riscv 中提供系统调用?

java - 在整个运行时保持 JDBC-MySQL 连接并且只在执行结束时关闭它是否有意义?

C# 在运行时找不到库

c++ - 尝试传递字符串变量时出现 TRACE 宏错误

build - bazel 规则中使用的自定义 cc_toolchain

riscv - 凿子——时钟门控