imx6 KGDB调试方法总结(光谷王凯的博客)

1,平台环境

PC:ubuntu12.04

单板:imx6(android4.4.2)

2imx6kernel编译加gdb调试

make menuconfig,然后按照Kernelhacking-->KGDB: kernel debugger-->KGDB: use kgdb over theserial console来配置内核。

编译kernel。编译完成后在内核源码下面会有一个vmlinux,接下来将要用到它。这个文件的作用类似与linux应用程序的可执行文件。将生成的bootimg.binkernel)烧写到单板上。

3imxuboot 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命令一样。



你可能感兴趣的:(linux内核)