准备工作

两台一样的VMware 的centos7的虚拟机。

Host 主机上安装minicom. gdb

Host vmare的增加管道类型的串口图:

kdb与Kgdb实践_linux

guest vmare 上增加管道类型的串口图

kdb与Kgdb实践_linux_02

准备要调试的OK和源代码 文件

其中OK与源代码文件要在两台host与guest两台主机上同时使用,我们使用虚拟机里的共享目录。

本例使用my-dev.ko已提前编译好,并gcc 使用-g参数,增加调试信息

创建调试环境

以下内容请严格按顺序一步步操作。

在guest中:

insmod my-dev.ko  //加载被调试的驱动模块。
echo ttyS2 > /sys/module/kgdboc/parameters/kgdboc  //告诉内核ttyS2作为kgdb的输出串口。
//取出guest主机上三my-dev.ko内存中的关键信息,这个在host主机gdb中要使用。
[root@localhost my-misc-dev]# cat /sys/module/my_dev/sections/.data
0xffffffffc0aa4000
[root@localhost my-misc-dev]# cat /sys/module/my_dev/sections/.bss 
0xffffffffc0aa4300
[root@localhost my-misc-dev]# cat /sys/module/my_dev/sections/.text 
0xffffffffc0aa2000

在host主机中做好侦听串口的工作。

//由于本例中Host主机与guest的主机的管道串口在系统中名称均为ttyS2.但在实际使用中这个名称可

能有不同。minicom的具体用法请自行百度。

minicom -D /dev/ttyS2

kdb与Kgdb实践_linux_03

如果offline表示minicom未进行接管,或是与guest未正常通信。

在guest中,主动暂停内核,等待调试器的操作.

echo g > /proc/sysrq-trigger //主动暂停内核,等待调试器的操作。输入此命令行,guest机进入“死机”状态。同时host主机minicom有一行打印

在host主机,查看minicom中的打印内容,同时回车,有[0]kdb>的提示符。

Entering kdb (current=0xffffa01cfa696eb0, pid 2892) on processor 0 due to Keyboa[0]kdb>

kdb与Kgdb实践_linux_04

在kdb>中提示下输入kgdb,表示等待进入gdb.

在host主机,打开gdb,在进入gdb之前增加一个配置文件 test.gdb

cat test.gdb //文件内容如下:其中文件主中.text .bss .data的参数都是guest主机上中my_dev.ko在内存中位置。
add-symbol-file //mnt/hgfs/Linux-test/gitee-centos/linux-kernel-klog/my-misc-dev/my-dev.ko 0xffffffffc0aa2000 -s .bss 0xffffffffc0aa4300 -s .data 0xffffffffc0aa4000

使用gdb命令进入

gdb /boot/vmlinuz-3.10.0-862.el7.x86_64

配置gdb远程调试参数

(gdb) set remotebaud 115200
(gdb) target remote /dev/ttyS2
(gdb) source /mnt/hgfs/Linux-test/gitee-centos/linux-kernel-klog/my-misc-dev/test.gdb

kdb与Kgdb实践_linux_05

开始gdb guest的内核

由于gdb的打开目录在my_dev.ko的编译目录,可以使用list my_ tab键 进行联想。

kdb与Kgdb实践_linux_06


可以list函数

kdb与Kgdb实践_linux_07

continue以后,无法使用ctrl+c来暂停guest内核的运行。

kdb与Kgdb实践_linux_08


再一次暂停guest内核的运行,需要在guest的shell中

echo g > /proc/sysrq-trigger

host机上的gdb状态

kdb与Kgdb实践_linux_09

简单的Info b与b的断点命令

kdb与Kgdb实践_linux_10

运行后进入断点,以及bt查看栈信息。

kdb与Kgdb实践_linux_11



http://blog.dynofu.me/post/2015/10/08/linux-live-debugging-with-kgdb-vmware-workstion.html#virtual-serial-port

https://www.kernel.org/doc/html/v4.18/dev-tools/kgdb.html

https://www.kernel.org/doc/html/v4.18/dev-tools/kgdb.html#running-kdb-commands-from-gdb

http://oliveryang.net/2015/08/using-kgdb-debug-linux-kernel-1/