关于搭建imx6 kgdb的教程网上有一篇,这里就不多详细介绍了
参考:https://blog.csdn.net/OnlyLove_/article/details/126805193
主要介绍下设置内容:
1. ubuntu下下载minicom
sudo apt-get install minicom
设置minicom的串口号和波特率等内容
2. 查看连接设备的USB的设备名称
连续插拔可以看到 ls /dev/tty* 下的哪个设备进行了挂载,多了哪个设备
ttyUSB0:与开发板连接的 USB 设备号。
3. 使用make menuconfig 开启调试内核选项
参考(linux内核调试环境搭建(VM_Centos+KGDB) - 简书 (jianshu.com))
1/Kernel hacking
--->Compile-time checks and compiler options
------>Compile the kernel with debug info
[编译的内核带有调试信息,可以帮助我们调试内核,建议开启]
2/Kernel hacking
--->Compile-time checks and compiler options
------>Compile the kernel with frame pointers
[内核使用帧指针寄存器来维护堆栈,可以正确地执行堆栈回溯,建议开启]
3/Kernel hacking
--->Magic SysRq key
[注册一个魔术键,使用$ echo"g">/proc/sysrq-trigger来激活KGDB,建议开启]
4/Kernel hacking
--->Write protect kernel read-only data structures
[关闭部分内存区域只读保护,建议关闭]
5/Kernel hacking
--->Set loadable kernel module data as NX and test as RO.
[内核空间只读选项,建议关闭]
6/Kernel hacking
--->KGDB: kernel debugger
[ KGDB内核调试开关,建议开启]
7/Kernel hacking
--->KGDB: kernel debugger
------>KGDB: use kgdb over the serial console
[ KGDB通过串口通信]
设置过后,make 生成的zimage 和 dtb镜像,烧录到开发板中
4. 启动开发板设置kgdboc参数
需要停留在uboot阶段,
setenv bootargs 当中 加入kgdboc=ttymxc0,115200
然后saveenv,执行reset
这一步有一个问题,就是我每次按键重启开发板,然后打印bootargs 发现没有kgdboc。
这个有待研究.。。。
5. 解决日志输出和GDB使用串口冲突问题
这里面的所有操作都是在主机上进行(ubuntu)
下载agent-proxy : http://git clone git://git.kernel.org/pub/scm/utils/kernel/kgdb/agent-proxy.git
编译的时候直接make ,记住,这个make 是你主机上面直接make,如果你把目标开发板的交叉工具编译链的命令加载到当前目录下的~/.bashrc的话,他会编译报错。所以去掉之后。source ~/.bashrc。编译过后生成agent-proxy。
在ubuntu 系统下cp agent-proxy 到主机的/bin目录下,然后执行:
agent-proxy 5550^5551 0 /dev/ttyUSB0,115200
开启agent-proxy 日志终端:
telnet localhost 5550
6. 调试驱动
6.1 编译驱动
调试驱动的时候需要把驱动编译成.ko文件下载到开发板当中。
这里用的也是: chrdevbase.ko这个驱动文件
编译ko的时候需要指定一下交叉编译架构和交叉编译工具
需要在makefile文件当中添加 最后两句 export:
KERNELDIR := /home/darton//MYS6ULx-devel/04-Source/MYiR-iMX-Linux/
CURRENT_PATH := $(shell pwd)
EXTRA_CFLAGS +=-g
obj-m := chrdevbase.o
build: kernel_modules
kernel_modules:
$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules
clean:
$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) clean
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
添加完成之后,make 生成.ko文件copy到开发板
6.2 获取驱动的加载起始地址信息
进到开发板终端,cat 一下加载到开发板当中的驱动text起始地址
cat /sys/module/chrdevbase/sections/.text
0x7f000000
6.3 触发kgdb(开发板)
echo g > /proc/sysrq-trigger
6.4 主机终端执行arm-linux-gnueabihf-gdb
【 这个建议到你生成的驱动.ko文件下执行这个命令,
不然下一步执行会提示找不到当前的.ko文件,
这里注意,添加符号表文件的这个ko是指定的kernel,driver里面生成的ko,就是指定的ubuntu系统下生成的.ko文件。不是链接开发板的ko。如果你没有进到相应的.ko目录下,
可以用gdb下的 pwd命令 查看一下当前目录的位置,然后用:
add-symbol-file 目录/chrdevbase.ko 0x7f000000 】
?????????????????????????????????????????
比如说我在用户目录下执行了arm-linux-gnueabihf-gdb,我加载的时候就要用
(gdb) pwd
Working directory /home/darton.
(gdb) add-symbol-file MYS6ULx-devel/04-Source/MYiR-iMX-Linux/drivers/char/1_chrdevbase/chrdevbase.ko 0x7f000000
add-symbol-file chrdevbase.ko 0x7f000000
添加之后,会如图这样:
add symbol table from file "chrdevbase.ko" at
.text_addr = 0x7f000000
(y or n) y
(no debugging symbols found)...done.
(gdb)
显示符号表未找到 (no debugging symbols found)...done.
这个原因是由于我们驱动当中没有添加编译生成关于调试符号表的信息
这个时候就需要在Makefile 当中添加:
EXTRA_CFLAGS +=-g
这个符号变量,然后make.
编译过后再加载add-symbol-file 主机上的.ko
成功的话 这个问题就会解决。显示
add symbol table from file "chrdevbase.ko" at
.text_addr = 0x7f000000
(y or n) y
Reading symbols from chrdevbase.ko...done.
(gdb)