天天看點

我是這樣調試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環境來驗證問題

繼續閱讀