Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1861987
  • 博文数量: 317
  • 博客积分: 1557
  • 博客等级: 上尉
  • 技术积分: 1208
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-26 23:38
个人简介

如果想出发,就不要等到明天!

文章分类

全部博文(317)

文章存档

2016年(1)

2015年(41)

2014年(152)

2013年(114)

2012年(4)

2011年(1)

2009年(4)

分类: 嵌入式

2015-04-07 12:54:51

原文地址:KGDB调试 作者:枫露清愁

在读这篇博文前,建议对GDB有些了解,尤其是GDB远程调试开发板程序(参见上一篇博文)

关于KGDB就不多说了,用来调试内核的,网上大把的介绍,废话不说,直接进入主题。

调试的是linux-3.3内核

KGDB调试设置步骤如下:

1. 配置开发板的内核,以支持KGDB,主要是通过“make menuconfig”选择以下选项:
General Setup--->
    Prompt fordevelopment and/or incomplete code/drivers
    
Kernel hacking--->
    Compile the kernel with debug info
    KGDB: kernel debugger --->
        除了“KGDB: internal test suite”都选上

2. 然后编译内核,烧写到到开发板

3. 进入uboot设置,在原来的bootargs环境变量里加上“kgdboc=ttyS2,115200 kgdbwait/kgdbcon”。因为我用的是开发板的ttyS2。例如:
setenv bootargs initrd=0xc1800000,0x800000 kgdboc=ttyS2,115200 kgdbwait/kgdbcon console=ttyS2,115200n8 root=/dev/ram rw rootfstype=ext2 mem=128M

下面分两种情况:
一、当为kgdbwait时,这种方法是用来调试内核的,以及驱动初始化的部分,这个时候内核停在刚启动的地方
1. 开启minicom,通过串口连接开发板,启动开发板,可以在minicom中看到,启动停在了如下地方:
[    1.258953] console [ttyS2] enabled
[    1.264492] kgdb: Registered I/O driver kgdboc.
[    1.269092] kgdb: Waiting for connection from remote gdb...

Entering kdb (current=0xc782a000, pid 1) due to Keyboard Entry
kdb> 
此时代表等待远程gdb连接    
注:此时不能用windows下面的串口终端(如SecureCRT),因为要通过CentOS使用串口来与开发板进行通信,如果使用
windonws下的串口工具,将会占用串口,CentOS就无法使用串口了

2. 在linux-3.3的根目录下输入“arm-none-linux-gnueabi-gdb vmlinux”来启动内核(vmlinux是未压缩的内核镜像)。
启动之后打印如下:
GNU gdb (Sourcery G++ Lite 2009q1-203) 6.8.50.20081022-cvs
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=i686-pc-linux-gnu --target=arm-none-linux-gnueabi".
For bug reporting instructions, please see:
<
(gdb) 
注意:要用交叉编译工具链的gdb启动,即arm-none-linux-gnueabi-gdb

3. 在上步的命令行下输入命令:“set remotebaud 115200”来设置波特率,
然后输入命令“target remote /dev/ttyS1”来启动开发板的GDB调试。

注意:像minicom的道理一样,这时候应该是“/dev/ttyS1”,如果改成“/dev/ttyS0”将无法启动,
另外建议这个时候退出minicom,如果这个时候连接minicom,也能连接上,但会出现minicom和内核调试
争夺串口的情况,会看到打印“Ignoring packet error, continuing...”
对于有些内核,设置波特率不起作用,就要通过“stty -F /dev/ttyS1 115200”设置,否则可能会打印
“warning: unrecognized item "timeout" in "qSupported" response”

4. 下面就可以使用命令对内核进行调试了,像远程调试应用程序一样,可以用list查看当前代码,
用break设置断点,如:
(gdb) b i2c_dev_init
Breakpoint 1 at 0xc0506494: file drivers/i2c/i2c-dev.c, line 606.
(gdb) c
Continuing.

Breakpoint 1, i2c_dev_init () at drivers/i2c/i2c-dev.c:606
606 printk(KERN_INFO "i2c /dev entries driver\n");
(gdb) n
608 res = register_chrdev(I2C_MAJOR, "i2c", &i2cdev_fops);
(gdb) n
609 if (res)
(gdb) p res

5.最后可以通过continue命令引导系统完全启动,启动完之后,我们就可以在用户端操作内核了,因为这个时候
串口已被kgdb调试占用,所以不能通过串口作为用户中断了,用telnet,这个时候之前设置的断电仍会起作用。如:
(gdb) b panic
Breakpoint 2 at 0xc03bb8e4: file kernel/panic.c, line 87.
(gdb) b sys_sync
Breakpoint 3 at 0xc00c0740: file fs/sync.c, line 100.
(gdb) c
Continuing.
一个是panic(),另一个是系统调用后要调用的sys_sync()。这两个断点的好处是,我们可以检查
kernel panic时系统的状态,另一可以在用户空间通过sync命令,halt住内核,进而进入调试会话

6.上面在用户终端下输入sync,develop会自动进入kgdb模式下的断点出,等待调试,这个时候用户不可以操作
开发板的内核,就是说当develop可以进行kgdb调试的时候,用户终端是不可以进行操作的,用户终端可以
操作的时候kgdb处于continuing状态,不可以进行调试。那么如何从用户状态切换到调试状态呢?
在用户状态下开发板上执行:echo g > /proc/sysrq-trigger,就进入到了kgdb调试状态下,这个时候可在
develop端对内核进行调试,然后在develop端输入continue命令,又可以进入到用户端


二、当为kgdbcon时,这种方法是用来调试模块的,先让内核启动,然后加载模块,再进入到调试模式
1.在develop端:
[root@ATP2400 /root]# insmod /test/test.ko
[root@ATP2400 /root]# cat /proc/modules 
 test 537 0 - Live 0xbf000000 (O)
root@ATP2400 /root]# echo g > /proc/sysrq-trigger

2.在develop端
[root@synway linux-3.3]# arm-none-linux-gnueabi-gdb vmlinux
(gdb) target remote /dev/ttyS1
(gdb) add-symbol-file ./test/test.ko 0xbf000000
(gdb) b emifa_exit
Breakpoint 1 at 0xbf00000c: file /nfsdir/atp2400/test/test.c, line 103.
(gdb) c
Continuing.
这个时候develop不可操作了

3.在开发板上卸载模块(rmmod test),则develop端自动进入kgdb模式的断点处

这种方法等同于用kgdbwait,然后用continue引导内核启动,之后所做的模块调试步骤一样
 

阅读(2306) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~