ログ日記

作業ログと日記とメモ

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) y
http://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に戻るのかが分からない…仕方がないので適当にシステムコールブレークポイントを設定しておいた。
一応成功した。


あとリモートのソースをコンパイルしたディレクトリごと持ってきたけど、初gdbなのでセオリーが色々分からない。

kdb

kdbって2.6.26でKGDBが組み込まれてからはもう過去のもの?バージョンはカーネルに合わせて上がってる。
使い方はetchのときに書いたはずなので省略。
マシンが一台でいいのが利点か。

プロファイリング メモ

あと読んでたらカーネルプロファイラのことが書いてあった。
http://d.hatena.ne.jp/big-eyed-hamster/20090324/1237833728
Oprofileというのがあるらしい。
あとでやる。