とりあえず下記handbookの内容を抄訳メモ。
他、"FreeBSD loadable module debug"などでググる。
で、上の内容なんだけど www."es".freebsd.org で見つかって、www.freebsd.orgの方には無い(2011-01-07時点)。
なんで、ちょっと不安。
あとあくまでもざっくり意訳したメモ書きで、実際に試してはいません。
1. デバッグ情報付きでモジュールをコンパイル
例としてlinux.ko:
# cd /sys/modules/linux # make clean; make COPTS=-g
2. モジュールがロードされたアドレスを見つける
リモートからGDBでデバッグしてる(オンライン)場合:デバッグ機でkldstatすればLinker File= .koファイルがロードされたアドレスが分かる。
例:
# kldstat Id Refs Address Size Name 1 4 0xc0100000 1c1678 kernel 2 1 0xc0a9e000 6000 linprocfs.ko 3 1 0xc0ad7000 2000 warp_saver.ko 4 1 0xc0adc000 11000 linux.ko
→ 0xc0adc000 に linux.ko がロードされてる。
crashダンプをkgdbなどでデバッグしてる(オフライン)場合:linker_files->tqh_first を起点として link.tqe_next を辿り、 filename が対象のlinker file名になっているエントリを見つける。見つかったら、 address メンバが linker file がロードされたアドレスを示している。
オンライン/オフラインそれぞれの場合でlinker fileがロードされたアドレスを見つけたら、その中に含まれている実行コードのアドレス(=linker file中でのオフセット)を調べる。
# objdump --section-headers /sys/modules/linux/linux.ko | grep text 3 .rel.text 000016e0 000038e0 000038e0 000038e0 2**2 10 .text 00007f34 000062d0 000062d0 000062d0 2**2 ^^^^^^^^ これがオフセット。
というわけで、この例なら
0xc0adc000 = linux.ko = linker fileがロードされたアドレス + 0x000062d0 = linker file中の".text"のオフセット = 実行コードのオフセット = 0xc0ae22d0 = 再配置後のメモリ上の実行コードのアドレス
3. GDB(kgdb)にシンボルをロードする
add-symbol-file コマンドでシンボルをロードする。
今回の例:
(kgdb) add-symbol-file /sys/modules/linux/linux.ko 0xc0ae22d0 add symbol table from file "/sys/modules/linux/linux.ko" at text_addr = 0xc0ae22d0? (y or n) y Reading symbols from /sys/modules/linux/linux.ko...done. (kgdb)
以上。
コメント