VMwareでLinuxカーネルのデバッグ
Debianのlenny用メモ。
kgdb
menuconfigでKGDBをオン。
あとCompile the kernel with debug infoをチェック。これ忘れててまたやり直した…でもあまり使わないかも。
apt-get install kernel-package zlib1g-dev linux-source-2.6.26 tar xvjf linux-source-2.6.26.tar.bz2 cd linux-source-2.6.26 cp /boot/config-2.6.26-2-686 .config make oldconfig make menuconfig make-kpkg --append-to-version "-2-686-kgdb" --revision=2.6.26.kgdb --initrd kernel-image
grubのmenu.listに
kernel /boot/vmlinuz-2.6.26-2-686-kgdb root=/dev/sda1 ro quiet kgdboc=ttyS0,115200 kgdbwait
後ろを付け加える。
一度停止してVMwareオプションのHardwareでシリアルポートを追加。pipeを選択して、/tmp/vmserial などにする。
設定はこの辺とか。
http://d.hatena.ne.jp/big-eyed-hamster/20090331/1238470673
VMwareのゲストOSにホストOSからシリアルで繋ぐ方法がなかなか分からなかった。
http://his.luky.org/ML/linux-users.a/msg01802.html
色々探してここを見てたら無理っぽい感じがしたけど
http://chamaken.blogspot.com/2008/06/kgdb.html
できるようだ。
apt-get install socat socat unix-connect:/tmp/vmserial pty,link=/tmp/ttyvm,raw,echo=0,waitslave rsync -avz remote:/usr/src/linux-source-2.6.26 . # ソースを見ないならvmlinuxだけ持ってくる cd linux-source-2.6.26 gdb file vmlinux target remote /tmp/ttyvm
LKMのデバッグ
make EXTRA_CFLAGS=-g などでデバッグオプションを有効にしてコンパイル。
insmodの後にgdbの設定。
.text、.dataセクションなどの先頭番地をgdbに教える必要がある。これらのアドレスは、/sys/module/モジュール名/sections/以下のファイルを見ればわかる。
# ls /sys/module/tcp_cubic/sections/ . .data .gnu.linkonce.this_module .strtab __param .. .data.read_mostly .init.text .symtab __versions .bss .exit.text .rodata .text # cat /sys/module/tcp_cubic/sections/.text 0xffffffff88196000これで、シンボルとアドレスの対応が付いて、正しい値を取り出すことができる。
(gdb) add-symbol-file net/ipv4/tcp_cubic.o 0xffffffff88196000 -s .data 0xffffffff881976e0 -s .bss \ 0xffffffff88199ac0 -s .data.read_mostly 0xffffffff881977e0 add symbol table from file "net/ipv4/tcp_cubic.o" at .text_addr = 0xffffffff88196000 .data_addr = 0xffffffff881976e0 .bss_addr = 0xffffffff88199ac0 .data.read_mostly_addr = 0xffffffff881977e0 (y or n) yhttp://tiki.is.os-omicron.org/tiki.cgi?c=v&p=Linux%2FLKM%2FGDB%A4%F2%BB%C8%A4%C3%A4%C6%A5%B3%A1%BC%A5%C9%A4%F2%C4%C9%A4%C3%A4%AB%A4%B1%A4%EB
で、insmodの後にどうやってgdbに戻るのかが分からない…仕方がないので適当にシステムコールにブレークポイントを設定しておいた。
一応成功した。
プロファイリング メモ
あと読んでたらカーネルプロファイラのことが書いてあった。
http://d.hatena.ne.jp/big-eyed-hamster/20090324/1237833728
Oprofileというのがあるらしい。
あとでやる。