准备工作
两台一样的VMware 的centos7的虚拟机。
Host 主机上安装minicom. gdb
Host vmare的增加管道类型的串口图:
guest vmare 上增加管道类型的串口图
准备要调试的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
如果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,表示等待进入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
开始gdb guest的内核
由于gdb的打开目录在my_dev.ko的编译目录,可以使用list my_ tab键 进行联想。
可以list函数
continue以后,无法使用ctrl+c来暂停guest内核的运行。
再一次暂停guest内核的运行,需要在guest的shell中
echo g > /proc/sysrq-trigger
host机上的gdb状态
简单的Info b与b的断点命令
运行后进入断点,以及bt查看栈信息。
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/