#navi_header|技術| とりあえず下記handbookの内容を抄訳メモ。 - FreeBSD Developers' Handbook, Chapter 10 Kernel Debugging, 10.7 Debugging Loadable Modules Using GDB -- http://www.es.freebsd.org/doc/en_US.ISO8859-1/books/developers-handbook/kerneldebug-kld.html 他、"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) 以上。 #navi_footer|技術|