利用KGDB调试linux内核源码
笔者使用的是Ubuntu18.04+imx6ull平台
配置内核
在2.6.26之后的内核都支持kgdb功能,要想使用该功能,需要在内核中进行配置
以下时笔者利用图形化配置的过程
在内核目录下执行
make menuconfig
使能以下选项(箭头代表路径)
PS:注意保存路径根据自己的配置而定
arch/arm/configs/imx_alientek_emmc_defconfig
配置完成以后重新编译内核
然后设置uboot参数
setenv bootargs 'console=ttymxc0,115200 kgdboc=ttymxc0,115200 kgdbwait root=/dev/nfs nfsroot=192.168.1.6:/home/adminu/linux/nfs/rootfs,proto=tcp rw ip=192.168.1.200:192.168.1.6:192.168.1.1:255.255.255.0::eth0:off'
saveenv
启动后会发现终端等待在kgdb
配置Ubuntu
下载
sudo apt-get install minicom
下载完成以后将开发板的串口连接到虚拟机
ttyusb0就是开发板的串口
sudo minicom -s
配置串口信息
保存以后不要关闭终端,重启开发板就可以看到内核启动的信息
然后关闭该终端(注意一定要关闭该终端)
测试Ubuntu的gdb是否可以连接到板子
执行以下命令
arm-linux-gnueabihf-gdb ./vmlinux
set serial baud 115200
target remote /dev/ttyUSB0
到这里Ubuntu的gdb及可以调试板子上的模块了
当然上述方法比较麻烦,就是使用gdb调试的时候需要将串口终端关闭,使用终端的时候又需要将gdb关闭。
配置两个串口
下载agent-proxy-1.97
下载源码后,在源码目录下打开终端,输入make,编译软件,将生成的程序文件拷贝到 /bin 目录下。
运行(此终端不能关闭)
sudo chmod 777 /dev/ttyUSB0
agent-proxy 5550^5551 0 /dev/ttyUSB0,115200
然后再运行一个终端
telnet localhost 5550
再开一个终端用作gdb调试
arm-linux-gnueabihf-gdb
最后成果
到这里环境搭建就完成了。下面进行实验。
实验
修改
setenv bootargs 'console=ttymxc0,115200 kgdboc=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.1.6:/home/adminu/linux/nfs/rootfs,proto=tcp rw ip=192.168.1.200:192.168.1.6:192.168.1.1:255.255.255.0::eth0:off'
saveenv
重启内核
加载模块、查看地址、启动kgdb
insmod beep.ko
cat /sys/module/beep/sections/.text
echo g > /proc/sysrq-trigger
在运行一个终端(注意该终端最好是在beep.ko的路径下)
arm-linux-gnueabihf-gdb
add-symbol-file beep.ko 0x7f000000
tar rem localhost:5551
断点测试
在gdb终端执行
b 75
c
回到开发板终端执行
./beepApp /dev/beep 0
会发现gdb终端停在断点处
至此kgdb调试内核模块环境搭建完成。
gdb命令介绍
命令 | 作用 | 示例 |
---|---|---|
break | 打断点 | b 75 |
continue | 从停止处运行程序 | c |
list | 列出源码 | l |
next | 执行下一步,不跳入函数内 | n |
step | 执行下一步,可跳入函数内 | s |
打印变量值 | p retvalue | |
quit | 推出gdb | q |
问题总结:
-
生成.ko模块时需要用-g。否则生成的模块不支持gdb调试
-
解决办法: Makefile文件中加入
COPTS=-g
-
-
执行add-symbol-file beep.ko 0x7f000000后找不到文件
- 解决办法:在beep.ko目录下打开gdb终端
参考
使用KGDB调试Linux驱动(以imx6ull开发板为例)_ZZuttr1912的博客-优快云博客
遗留问题:
在上述基础上可以利用vscode进行可视化调试,笔者尝试搭建环境没有成功,大家可以尝试搭建以下。等你们的好消息