Chinaunix首页 | 论坛 | 博客
  • 博客访问: 197932
  • 博文数量: 23
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 428
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-05 12:46
个人简介

博客转移至CU。之前的百度空间博客http://hi.baidu.com/williwill。

文章分类

全部博文(23)

文章存档

2014年(18)

2013年(5)

我的朋友

分类: 嵌入式

2014-03-24 21:37:44

       如何单步源码级调试Linux内核一直困扰着linux驱动开发人员,内核有其代码量大、逻辑复杂、与硬件交互的特性。因此,有着不同于应用程序的调试方法,据统计Linux内核开发者使用最普遍的调试方法是printk方法,而其他的方法大多是在特殊情况下才会使用。本文介绍的Kgdb调试方法是一种源码级的Linux内核调试器。使用Kgdb调试内核时,需要结合gdb一起使用,使用他们可以对内核进行单步调试,设置断点,观察变量、寄存器的值等。然而也有其限制条件,本文仅简单介绍使用串口的Kgbd的流程(kgdboc方式),除此之外还网卡方式即kdgboe方式,Kgdb调试原理及kgdboe方式配置请参阅博文《Linux内核驱动开发之KGDB原理介绍及kgdboe方式配置》。

/**********************************************************************************************************************************/

原创作品,转载时请务必以超链接形式标明文章原始出处:http://blog.csdn.net/gqb666/article/details/9117597,作者:gqb666  
/**********************************************************************************************************************************/

     关键步骤:

一、配置Linux内核,使其支持KGDB。

    依次进行如下配置:

    $make menuconfig(下面配置为必须进行的           



  1. Kernel hacking--->
  2.        -*- Magic SysRq key
  3.        [*] Kernel debugging
  4.        [*] Compile the kernel with debug info
  5.        [*] KGDB: kernel debugging with remote gdb --->
  6.               <*> KGDB: use kgdb over the serial console

         配置成功后进行Linux内核的编译。make uImage并生成uImage拷贝到nfs/tftp服务器,等待u-boot下载内核或者直接烧到flash从flash启动。

二、修改u-boot的启动参数bootargs以支持kgdb调试

          setenv bootargs 'console=ttyS0,115200n8 kgdboc=ttyS0,115200 kgdbwait …… nfsroot=……'

         主要增加以上红色字体部分,指定kgdb使用开发板上的哪个串口,注意这里是串口名而不是设备文件/dev/ttyS0。

三、配置虚拟机与PC机的串口映射。如博主的Vmware虚拟机使用usb转串口到linux下串口设备名为/dev/ttyS1(将在第五步使用)。可以通过mincom进行实际测试。

四、在虚拟机linux系统下使用minicom启动开发板的内核方法如下

                     tftp进行下载内核                  


  1.     OMAP3_EVM # tftp
  2.     smc911x: detected LAN9220 controller
  3.     smc911x: phy initialized #by guoqingbo
  4.     smc911x: MAC 02:01:05:96:02:01
  5.     Using smsc911x-0 device
  6.     TFTP from server 192.168.1.93; our IP address is 192.168.1.94
  7.     Filename 'uImage'.
  8.     Load address: 0x82000000
  9.     Loading: #################################################################
  10.              #################################################################
  11.              #################################################################
  12.              #################################################################
  13.              #################################################################
  14.              #################################################################
  15.              #################################################################
  16.              ##########################
  17.     done
  18.     Bytes transferred = 2459200 (258640 hex)

 使用bootm启动linux后会在下面输出信息处停下(要注意的是完成此步骤后务必要手工关闭该minicom会话,因为gdb远程连接时也需要此串口)等待gdb的连接:        



  1. Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
  2. serial8250.0: ttyS0 at MMIO 0x4806a000 (irq = 72) is a ST16654
  3. console [ttyS0] enabled #by guoingbo
  4. serial8250.1: ttyS1 at MMIO 0x4806c000 (irq = 73) is a ST16654
  5. serial8250.2: ttyS2 at MMIO 0x49020000 (irq = 74) is a ST16654
  6. kgdb: Registered I/O driver kgdboc.
  7. kgdb: Waiting for connection from remote gdb...

截图来说明一下:


五、使用gdb调试vmlinux文件。使用前述博文在ubuntu10.04成功移植gdbserver及gdbserver使用介绍(用于CCSV5.2远程调试ARM CORTEX-A8程序)移植的 arm-none-linux-gnueabi-gdb进行调试内核文件vmlinux。方法如下

             在linux内核源码根目录下创建一个.gdbinit文件其内容为            


  1. set remotebaud 115200
  2. target remote /dev/ttyS1


           然后同样在Linux内核源码目录下运行如下命令

             arm-none-linux-gnueabi-gdb ./vmlinux

           不出意外的会有如下信息输出则说明已经连接成功,可以像gdb调试应用程序一样调试linux内核了      


  1. Reading symbols from /home/ss/develop_environment/v2/sys/dvsdk/ti-dvsdk_dm3730-evm_4_02_00_06/psp/linux-2.6.32-psp03.00.01.06.sdk/vmlinux...done.
  2. During symbol reading, DW_AT_name missing from DW_TAG_base_type.
  3. During symbol reading, unsupported tag: 'DW_TAG_const_type'.
  4. During symbol reading, Child DIE 0x408b33 and its abstract origin 0x4085ee have different parents.
  5. During symbol reading, DW_AT_type missing from DW_TAG_subrange_type.
  6. kgdb_breakpoint () at kernel/kgdb.c:1744
  7. 1744 arch_kgdb_breakpoint();
  8. (gdb)

截图:


六、若用DDD图形界面调试四个步骤相同,只需第五步中的命令换成

   ddd --debugger arm-none-linux-gnueabi-gdb ./vmlinux  命令即可


                                                           DDD调试内核的界面

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