2013/05/29

Debugging ASL with jprobe


前幾篇文章有提到用 systemtap 來監視 ASL 呼叫的順序,但使用 systemtap 有幾個缺點:

  1. 要抓近 700 MB 的 debug symbols
  2. 要在裡頭加入自己的 c code 很麻煩

也因此小弟改用了 jprobe 來實作這個部分,並且加入了 ASL 整數參數的列印。以下是使用方式:

先抓 jprobe 程式,其中在 jprobes 資料匣中有個 acpica 資料匣,那是直接從 kernel source code drivers/acpi/acpica 中複製下來,我這裡是用 3.5.0-22,這裡可能會需要各位抓自己對應的 kernel 版本來用。

$ git clone https://github.com/fcwu/sys_prog.git
$ cd sys_prog/jprobes
$ make -C /lib/modules/`uname -r`/build M=`pwd`

插入模組,再清空 dmesg 訊息。

$ sudo insmod jprobe1.ko
$ sudo dmesg -c

最後按下會發出 Q event 的 hotkey,再執行 dmesg 就可以看到輸出結果如下:

[ 9113.652829] ASLP:_L13 >
[ 9113.652956] ASLP:_L13 <
[ 9113.652985] ASLP:_Q66 >
[ 9113.653043] ASLP:..NEVT >
[ 9113.653059] ASLP:....ECG1 >
[ 9113.653075] ASLP:......ECRW >
[ 9113.653081] ASLP:......  Op0: Integer 0000000000000007
[ 9113.653097] ASLP:........ECR2 >
[ 9113.653102] ASLP:........  Op0: Integer 0000000000000007
[ 9113.653115] ASLP:..........ECR1 >
[ 9113.653120] ASLP:..........  Op0: Integer 0000000000000007
[ 9113.653739] ASLP:..........ECR1 <
[ 9113.653773] ASLP:..........ECR1 >
[ 9113.653780] ASLP:..........  Op0: Integer 0000000000000008
[ 9113.654973] ASLP:..........ECR1 <
[ 9113.655005] ASLP:........ECR2 <
[ 9113.655016] ASLP:......ECRW <
[ 9113.655024] ASLP:....ECG1 <

ASL 真是愈來愈好追了。

No comments: