Skip to content
This repository has been archived by the owner on Jul 23, 2024. It is now read-only.

Latest commit

 

History

History
30 lines (22 loc) · 1.89 KB

File metadata and controls

30 lines (22 loc) · 1.89 KB

spike调试linux为什么如此慢?

spike十分方便,也很好进行修改配置,但最近使用发现一个挺大的问题 —— 一旦加入 -d 选项,spike运行linux速度会非常非常慢😭完全在shell上操作不过来,效果如下

效果参见视频

我们此次就看看能否解决这个问题

问题分析 其实和朋友讨论看到了,速度慢并不慢在linux的运行,而主要是我们输入命令后,整个程序似乎一直卡在echo这个命令。所以呢,大概率和交互时候的 STDIN 相关。同时,我用pk进行测试发现,输入速度是很快的,且不带命令回显,问题更可能是设备上的。

Spike 调试分析

通过对每一步的过程分析,可以发现在debug模式下,即使运行 rs (run silently) 也一样很卡,看到相关的代码

void sim_t::interactive_run(const std::string& cmd, const std::vector<std::string>& args, bool noisy)
{
  size_t steps = args.size() ? atoll(args[0].c_str()) : -1;
  ctrlc_pressed = false;
  set_procs_debug(noisy);
  for (size_t i = 0; i < steps && !ctrlc_pressed && !done(); i++)
    step(1);
}

无论是silent还是noisy,都会来到这一步,我们发现,循环过程的主体是step(1),这就表示其运行相当于还是 step & step 的,而不像正常运行过程(参见代码)是 step(MAX_STEPS) 的,若做修改可以发现速度加快了很多

值得思考的是,在调试模式下,如run until,为了能够精确达到断点,最自然也是最愚笨的方法就是一步一步,走一步比较一下。我们猜测是step这个函数内的实现存在的一些冗余,导致其有大量重复工作,或许在快速运行的调试模式下可以加入一些判断

结论

所以总结来说,spike进入调试模式后,就是这么慢😭 等有时间看看,为啥qemu的速度会那么感人