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
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不可操作了