カーネルをgdbでリモートデバッグできるようにするかーとか思ってやってたわけです。
しかし、下記のような感じでちょっとハマってました。
- ブレークポイントが効かなかったり
- vmlinuxとvmlinuzの組が合ってるのにシンボル名が出なかったり
- Cannot access memory at address 0xffffffff8124d730とかで落ちたり
原因はKASLRが有効だったため、実行時にアドレスがランダマイズされていたのが原因ですね\(^o^)/
解決策はKASLRをoffにすれば良いだけです。そのためにカーネルの再ビルドは不要で、カーネルのコマンドラインでnokaslrを渡せばOKです。
そうすればこのようにいい感じに
以下はめも
remote接続にシリアルコンソールを使う場合
qemuはこんな感じになる。
$ qemu-system-x86_64 -kernel vmlinuz -initrd initramfs.img -m 2048 -append "nokaslr console=tty0 kgdboc=ttyS0,115200 kgdbwait" -chardev pty,id=pty -device isa-serial,chardev=pty
そうすると以下のようなメッセージが出るので、gdbではこのデバイスに対してアクセスする。
qemu-system-x86_64: -chardev pty,id=pty: char device redirected to /dev/pts/2 (label pty)
gdbからリモートアクセスするとこんな感じに。
gdb-peda$ target remote /dev/pts/2 Remote debugging using /dev/pts/2 Warning: not running or target is remote kgdb_breakpoint () at kernel/debug/debug_core.c:1073 1073 wmb(); /* Sync point after breakpoint */
remote接続にTCPを使う場合
この場合は普通に-sオプションを使えばOK。
$ qemu-system-x86_64 -kernel vmlinuz -initrd initramfs.img -m 2048 -append "nokaslr" -s -S
gdbからアクセスするときもこのように。
masami@saga:~/tmp/test$ gdb ./vmlinux Reading symbols from ./vmlinux...done. gdb-peda$ dir usr/src/debug/kernel-4.15.fc27/linux-4.15.2-300.fc27.x86_64/ Source directories searched: /home/masami/tmp/test/usr/src/debug/kernel-4.15.fc27/linux-4.15.2-300.fc27.x86_64:$cdir:$cwd gdb-peda$ target remote :1234 Remote debugging using :1234 Warning: not running or target is remote 0x000000000000fff0 in cpu_hw_events () gdb-peda$ b __kmalloc Breakpoint 1 at 0xffffffff8124d730: file mm/slub.c, line 3746. gdb-peda$ c Continuing. Warning: not running or target is remote Breakpoint 1, __kmalloc (size=size@entry=0xa8, flags=flags@entry=0x14080c0) at mm/slub.c:3746 3746 { gdb-peda$
- 作者: IgorZhirkov
- 出版社/メーカー: 翔泳社
- 発売日: 2018/01/19
- メディア: Kindle版
- この商品を含むブログを見る