2011/10/17

LinuxでLoadable Moduleをデバッグする

Linux のloadable moduleをデバッグしたときのメモ。
元ネタはO'Reillyの"Linuxデバイスドライバ"。
static linkしたモジュールはgdbでvmlinuxを読み込めばシンボル情報が読み込まれるが、loadable moduleは一手間かけないとシンボルが見えない。

ここでは uvcvideo モジュールをデバッグ対象とする。
まず、ターゲットとなるモジュールの.text, .bss, .dataのアドレスを得る。

# cat /sys/module/uvcvideo/sections/.{text,bss,data}
0xf86c6000
0xf86d4560
0xf86d3000


続いてデバッガでシンボルを追加する。カレントディレクトリはLinuxカーネルソースのディレクトリ。

(gdb) add-symbol-file drivers/media/video/uvc/uvcvideo.ko 0xf86c6000 -s .bss 0xf86d4560 -s .data 0xf86d3000


これで関数名を指定してブレークポイントを置いたり、ソースを追いながらステップ実行できるようになる。
もう少し楽にやる方法はないかと思う。

なお、.ko にデバッグ情報を残すにはモジュールのソースディレクトリにある Makefile に、

EXTRA_CFLAGS += -O0 -g


などと記述しておけば良い。

ついでにモジュールのみのビルド方法は、カーネルソースのトップディレクトリにおいて、"make M=[モジュールのディレクトリ]"。

0 件のコメント:

コメントを投稿