【问题标题】:How to trace dynamic instruction in spike (on RISC-V)如何在尖峰中跟踪动态指令(在 RISC-V 上)
【发布时间】:2020-06-30 12:35:18
【问题描述】:

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

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

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

  • -g - 追踪 PC 的直方图

  • -l - 生成执行日志

我不确定结果是否符合我的预期。 有谁知道如何在尖峰中进行动态指令跟踪? 非常感谢!

【问题讨论】:

    标签: runtime trace riscv spike


    【解决方案1】:

    是的,您可以使用-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 输出中查找地址)并从那里单步执行(通过多次返回)。也可以通过在峰值提示符处输入 h 来查看帮助屏幕。

    【讨论】:

    • 感谢您的回答。这正是我需要的!但是我仍然对跟踪指令有一些疑问。我确实在跟踪中看到了“ecall”和“sret”,并找到了它们之间的对应关系。但是,也有一些“sret”对应于“exception trap_instruction_page_fault, ...”。它们之间的那些指令是pk中执行的指令吗?
    • @Rosyphoton 您的程序在用户模式下执行,而 pk 在主管模式下执行。如果您看到sret 指令,这意味着从主管模式返回。这意味着sret 之前的指令(直到出现陷阱)属于 pk。页面错误只是如何调用从用户模式切换到主管模式(即从用户模式切换到内核空间)的另一个示例。在答案中,您看到陷阱是由ecall 引起的。
    猜你喜欢
    • 1970-01-01
    • 2018-11-22
    • 2023-03-22
    • 2023-04-01
    • 2021-05-22
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多