调试内核的方法有很多。 但是通过gdb 和KVM调试有以下几个好处。
1) 可以实现单步调试。
2) 环境配置简单。
1. RHEL7.3上实现KVM内核调试。
1) 在domain行,追加xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0' 。并追加<qemu:commandline>标签,该标签将会允许启动qemu时,向qemu传送GDB相关option。 当然也可以同时配置多个tcp port来调试多个KVM内核。修改后退出virsh,不需要重启libvirt服务。
# virsh edit rhel7.3
<domain type='kvm'
xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0' >
<qemu:commandline>
<qemu:arg value='-gdb'/>
<qemu:arg value='tcp::1235'/>
</qemu:commandline>
...
2) 重启启动虚拟机。
# virsh start rhel7.3
3) 通过netstat查看是否正在监控1235端口,如果如下输出,说明配置成功。
# netstat -tapn | grep 1235tcp 0 0 0.0.0.0:1235 0.0.0.0:* LISTEN 22413/qemu-kvm
4) 虚拟机将会需要加载一些参数“kgdboc=ttyS0,115200”
用于支持KGDB调试。通过grubby命令完成。
# grubby --update-kernel=ALL --args="console=ttyS0,115200 kgdboc=ttyS0,115200
5) 在虚拟机上安装debuginfo的包。
# debuginfo-install --downloadonly kernel-3.10.0-327.el7
# rpm -ivh kernel-debuginfo-3.10.0-514.el7.x86_64.rpm
# rpm -ivh kernel-debuginfo-common-x86_64-3.10.0-514.el7.x86_64.rpm
6) 在host上创建用于调试的目录。并解压虚拟机内核对应的debug rpm包。
# mkdir /home/wulm/kvm_debug
# cd /home/wulm/kvm_debug
# rpm2cpio kernel-debuginfo-3.10.0-514.el7.x86_64.rpm | cpio -idmv# rpm2cpio kernel-debuginfo-common-x86_64-3.10.0-514.el7.x86_64.rpm | cpio -idmv
7) 接下来就可以用gdb进行调试了,当然要提前安装好gdb。
# gdb -tui usr/lib/debug/lib/modules/3.10.0-514.el7.x86_64/vmlinux
(gdb) target remote 127.0.0.1:1235 (这时候虚拟机已经被中断)
(gdb)c (虚拟机可以运行了)
reference
- https://access.redhat.com/blogs/766093/posts/2690881