1,平台环境
PC:ubuntu12.04
单板:imx6(android4.4.2)
2,imx6的kernel编译加gdb调试
make menuconfig,然后按照Kernelhacking-->KGDB: kernel debugger-->KGDB: use kgdb over theserial console来配置内核。
编译kernel。编译完成后在内核源码下面会有一个vmlinux,接下来将要用到它。这个文件的作用类似与linux应用程序的可执行文件。将生成的bootimg.bin(kernel)烧写到单板上。
3,imxuboot bootargs的修改
添加 kgdboc=ttymxc0,460800 kgdbwait
ttymxc0是单板调试串口,460800为波特率。kgdbwait的作用是等待kgdb的连接。
修改好后编译生成新的的u-boot.bin文件,烧写到单板上。
重新上电后,单板会提示等待远程连接。
kgdb:Registered I/O driver kgdboc.
kgdb:Waiting for connection from remote gdb...
4,连接单板
在imx6kernel源代码目录下面,输入命令:
../../andr-src/android/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7/bin/arm-eabi-gdb vmlinux
成功后,可以进入到gdb命令行界面,如下:
Readingsymbols from/home/king/work/7_2015/package_imx6s_android_150701/sys-src/kernel/vmlinux...done.
(gdb)
在gdb命令行下输入命令:
set remotebaud 460800
target remote /dev/ttyUSB1
我的PC上面和ttymxc0连接的串口对应的设备节点为ttyUSB1,根据情况来设定。
如果成功连接则有如下的提示:
Remote debugging using /dev/ttyUSB1
kgdb_breakpoint() at kernel/debug/debug_core.c:954
添加断点:
b serial_write
然后输入c,当应用程序往串口里写入数据的时候,会停在断点serial_write函数处。如下:
Breakpoint1, serial_write (filp=0xd67573c0, ubuf=0xbee3f87e "\245",size=13,
pos=0xd6b25f88) atdrivers/ywwh_imx_tty/ywwh_imx_tty.c:601
601 if (0 == size) return 0;
(gdb) l
596
597staticssize_t serial_write(struct file *filp, const char __user*ubuf,size_t size, loff_t *pos) {
598yw_mx6_serial *dev = filp->private_data;
599struct bi_circ_t *pbc = &dev->bcbuf_tx;
600unsigned long tmp;
601if (0 == size) return 0;
602/* This driver support NON_BLOCK mode only */
603tmp = bi_circ_limited_free(pbc);
604if (tmp) {
605++dev->status.wr;
此时就可以用gdb命令行来调试内核。和应用程序中的gdb命令一样。