天天看点

我是这样调试kernel的race condition的, 超有用

内核调试中, 经常会有race, 方便的调试方法可以手动造一个环境出来模拟一下我们想要的时序, 来验证想法.

*

比如说, a, b, 2个task, 想让a跑到某行指令的时候, 暂停运行, 然后让b运行来尝试进入共有的临界区,

一种最简单的想法就是在a的代码中加入sleep,

sleep其实会引发调度, 所以就改成while 1,

改成while 1, 其他task跑到这里的时候也会生效,

所以加if条件语句,

这些方法公有的缺点都是需要改代码, 重新编译,

下面是一种不用改代码的方法

比如现在task 9171停到了kswapd_try_to_sleep+281

然后把rip改成bogus_64_magic去

然后让系统继续跑

这样task 9171就相当于在某条指令之后就不跑了, cpu占用100, 符合预期

就可以很方便的构造race环境来验证问题

继续阅读