Да, вы можете вызвать spike с помощью -l
, чтобы получить трассировку всех выполненных инструкций.
Пример:
$ spike -l --isa=RV64gc ~/riscv/pk/riscv64-unknown-elf/bin/pk ./hello 2> ins.log
Обратите внимание, что эта трасса также содержит все инструкции, выполненные proxy-kernel - а не просто трассировка вашей пользовательской программы.
Трассировка все еще может быть полезна, например, вы можете искать начальный адрес вашего кода (т.е. искать его в выводе 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 ..]
Это означает, что вы можете пропустить инструкцию sycall (которая выполняется в pk) путем поиска следующего sret.
Кроме того, вы можете вызвать spike с помощью -d
, чтобы войти в режим отладки. Затем вы можете установить точку останова для первой интересующей вас инструкции в вашей программе (until pc 0 YOURADDRESS
- найдите адрес в выводе objdump) и сделать один шаг оттуда (нажав несколько раз return). См. Также экран справки, введя h в приглашении всплеска.