R's Workshop

Backtrace Function Call in GCC

在 debug kernel 的時候, 要追 function call stack 最簡單的方式就是呼叫 dump_stack(). 在 user space 寫 C function 時, gcc 也提供了一個類似的 API. Read more

Use HW breakpoint to Watch Kernel Data Address

因為 kerenl 的 tasklet 可以 access 任意的記憶體位置, 要如何在茫茫 tasklets 中找到是誰修改了某個變數在 debug 上非常重要. 還好 Linux kernel 提供了 HW breakpoint 的方式, 讓我們可以在要 monitor 的位置上註冊一個 trap. 當 kernel 對該位置讀寫時觸發 trap 來做進一步 debug, 比方說 dum... Read more

Check BUG ON() Happens at which File and Line

最近處理一個掛在 __timer() 的 kernel crash, 發現 log 裡的一個有趣的地方. 看起來是可以透過開一些額外的 kenrel config 來印出更多訊息. Kernel BUG at __mod_timer+0x2c8/0x3d0 [verbose debug info unavailable] Read more

Show C Macro Value in Compile Log

工作上要維護的那份 driver 太亂, 常常搞不清楚一個 macro 到底有沒有被定義, 或是被定義成什麼值. 在 stack overflow 看到一個利用 gcc stringification 的方法, 在 compile log 裡直接印出 macro 值. Read more

Check Macro Value is Power of Two at Compile Stage

在實做 ring buffer 時, 如果 buffer size 是 2 的冪次方, 就能使用 bit-wise mask 來處理 index 移動後產生的 wrap around, 減少使用的 CPU cycles. 但如果有另一個人不小心把 buufer size 改成非 2 的冪次方, bit-wise mask 的作法就會出問題, 所以大部分人怕麻煩還是會用 modulo oper... Read more