kgdb调试linux驱动程序

利用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
print打印变量值p retvalue
quit推出gdbq

问题总结:

  1. 生成.ko模块时需要用-g。否则生成的模块不支持gdb调试

    1. 解决办法: Makefile文件中加入

      COPTS=-g
      
  2. 执行add-symbol-file beep.ko 0x7f000000后找不到文件

    1. 解决办法:在beep.ko目录下打开gdb终端

参考

使用KGDB调试Linux驱动(以imx6ull开发板为例)_ZZuttr1912的博客-优快云博客

遗留问题:

在上述基础上可以利用vscode进行可视化调试,笔者尝试搭建环境没有成功,大家可以尝试搭建以下。等你们的好消息

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值