Skip to content

bug analysis in rcore development

chyyuu edited this page May 10, 2019 · 1 revision

rustc最后貌似“死掉”的原因分析:

分析结果: 经过一系列改进,分析rustc的syscall序列,看到已经产生执行程序了。但最后貌似“死掉”,不动了。目前还没有ctrl-c支持,所以一开始以为是系统死锁了。但王润基进一步深入分析后,发现:rustc会启动cc做最后的链接工作,方法是创建pipe后fork,然后poll pipe reader等待输出,之后cc无输出正常退出。此时pipe应该断开,变为可读态,poll应该结束阻塞返回。但我们目前没有对pipe实现poll的唤醒,所以就貌似“卡死”了。/其实只是rustc这个应用在等待而已。系统没有死锁。

forktest/forktree貌似“死掉”的原因分析:

分析结果: 王润基发现有两个问题:

  1. 在多核上跑会panic,原因是目前自映射的实现对页表有竞争访问,在多核且大量fork修改页表的情况下会出错。已经通过在全局加锁解决。
  2. 所有进程跑完后shell未被唤醒(和rustc是同样现象),原因是Process对象没能及时释放,导致wait时误以为目标进程还没结束。进一步分析原因是proc.parent是强引用,于是父进程Process对象总会在所有子进程结束后才被释放。改成弱引用后就解决了。