Vmware+CentOS+KGDB内核双机调试

1.准备两台CentOS系统的vmware虚拟机

其中一台作为调试机,另一台则作为被调试机。如下图,CentOS7.9x64为被调试机,CentOS7.9x64-Debugger为调试机

Vmware+CentOS+KGDB内核双机调试_第1张图片

2.配置串口设备

若虚拟机有串口设备(如打印机),需要先删除串口设备,然后新添加一个串口设备
配置CentOS7.9x64被调试机

Vmware+CentOS+KGDB内核双机调试_第2张图片

配置CentOS7.9x64-Debugger调试机

 Vmware+CentOS+KGDB内核双机调试_第3张图片

配置完成后,测试串口是否配置OK,
在被调试机CentOS7.9x64中执行cat /dev/ttyS0,在调试机CentOS7.9x64-Debugger中执行echo hello >/dev/ttyS0,若在CentOS7.9x64中看到如下图回应,则配置成功

3.编译内核

安装依赖

yum install rpm-build redhat-rpm-config asciidoc hmaccalc perl-ExtUtils-Embed pesign xmlto
yum install audit-libs-devel binutils-devel elfutils-devel elfutils-libelf-devel java-devel
yum install ncurses-devel newt-devel numactl-devel pciutils-devel python-devel zlib-devel

下载内核源码包

        https://vault.centos.org/7.9.2009/os/Source/SPackages/kernel-3.10.0-1160.el7.src.rpm

安装内核源码包

yum install mock
useradd -s /sbin/nologin mockbuild
rpm -ivh kernel-3.10.0-1160.el7.src.rpm

解压源码包

cd /root/rpmbuild/SPECS
rpmbuild -bp --target=$(uname -m) kernel.spec

配置编译选项

cd /root/rpmbuild/BUILD/kernel-3.10.0-1160.el7/linux-3.10.0-1160.el7.x86_64
cp /boot/config-3.10.0-1160.el7.x86_64 .config [可选]
make menuconfig

勾选Kernel hacking以下选项:
-*- Magic SysRq key 
[*] Compile-time stack metadata validation 
[*] Compile the kernel with debug info
[*] Compile the kernel with frame pointers
[*] KGDB: kernel debugger  --->
<*>   KGDB: use kgdb over the serial console 

编译内核

make
make modules_install
make install

4.配置被调试机内核引导参数

编辑CentOS7.9x64的/boot/grub/grub.cfg或者/boot/grub2/grub.cfg,在需要调试的内核引导项上添加串口调试参数:kgdboc=ttyS0,115200 kgdbwait kgdbcon nokaslr,2.6.16的参数为kgdb8250=1,115200 kgdbwait

 其中nokaslr是关闭内核地址空间随机化功能,Linux内核从2.6.25版本开始引入的功能。如果开启KASLR功能,使用KGDB调试时无法直接使用函数名打断点。

5.引导调试内核

重启被调试机CentOS7.9x64,选择需要调试的引导项,然后引导过程会暂停在如下图,等待远程调试

Vmware+CentOS+KGDB内核双机调试_第4张图片

 6.远程调试

将被调试机CentOS7.9x64编译出来的内核拷贝到调试机上。(推荐做法是克隆被调试机,作为调试机)
在调试机CentOS7.9x64-Debugger上:

gdb vmlinux
set remotebaud 115200 或者  set serial baud 115200
target remote /dev/ttyS0

成功附加远程主机后,会显示如下图:

Vmware+CentOS+KGDB内核双机调试_第5张图片

 附加成功后,可执行c命令继续让目标机引导。
后续需要中断目标机时,可以在目标机执行echo g > /proc/sysrq-trigger,控制权即可转移给gdb。

7.内核模块的调试

一般内核调试都会涉及调试自己开发的内核可加载模块,要调试自己的内核模块,需要先让目标机加载驱动,然后再进行调试。
在被调试机CentOS7.9x64中:

insmod lkm.ko
cat /sys/module/lkm/sections/.text /sys/module/lkm/sections/.data /sys/module/lkm/sections/.bss

在调试机CentOS7.9x64-Debugger上:

add-symbol-file /root/lkm.ko 0xffffffffc0533000 -s .data 0xffffffffc0538000 -s .bss  0xffffffffc0538600
source 
break 

你可能感兴趣的:(Linux,Linux内核驱动,调试工具,centos,linux)