VMware+Fedora+KGDB环境搭建及调试

一、准备环境

1. 下载Fedora,版本Fedora-Live-Desktop-x86_64-20-1.iso

2. 安装VMware10.0.0 build-1295980

3. VMware 虚拟两台Fedora, 第一台名为Fedora-Client-host:

step 1:

 

step2:

 

step3:

step4:

step5:

step6:

step7:

step 8:

4. Fedora安装之后,要接着安装必要的软件:

      [root@localhost xxxxx]# yum  install gcc  

      [root@localhost xxxxx]# yum  install perl

      [root@localhost xxxxx]# yum  install ncurses-devel

      5. 现在的内核是没有开启KGDB调试的,所以需要重新编译内核。Fedora-Live-Desktop-x86_64-20-1kernel版本为3.11.10-301.fc20.x86_64,从网站 https://www.kernel.org/ 下载源代码linux-3.12.1版本,解压缩并将解压后的内容拷贝到/usr/work/目录下, 注意用Root账号,因为内核编译是要Root的权限。

      6. 进入源码目录linux-3.12.1,执行make menuconfig进行KGDB的内核选项配置(这些选项default就有,不需要修改)。 

         (1)CONFIG_DEBUG_INFO = y 该选项可以使得编译的内核包含一些调试信息,使得调试更容易。 

     位置:---->Kernel hacking
        ---->Compile-time checks and compiler options
        ---->Compile the kernel with debug info
     (2)CONFIG_FRAME_POINTER = y 该选项将使得内核使用帧指针寄存器来维护堆栈,从而就可以正确地执行堆栈回溯,即函数调用栈信息。 
     位置:---->Kernel hacking
        ---->Compile-time checks and compiler options
        ---->Compile the kernel with frame pointers
     (3)CONFIG_MAGIC_SYSRQ = y (如果你选择了KGDB_SERIAL_CONSOLE,这个选项将自动被选上) 激活"魔术 SysRq"键. 该选项对kgdboc调试非常有用,kgdb向其注册了‘g’魔术键来激活kgdb 。   
   位置:---->Kernel hacking
        ---->Magic SysRq key
         //关闭的选项

     (4)CONFIG_DEBUG_RODATA = n 该选项是将内核的一些内存区域空间设置为只读,这样可能导致kgdb的设置软断点功能失效。所以推荐将该选项关闭。   
     位置:---->Kernel hacking
        ---->Write protect kernel read-only data structures
     (5)CONFIG_DEBUG_SET_MODULE_RONX =n,该选项会将内核模块空间设置为只读,这样会导致调试内核模块时设置断点功能失效,设置断点时出现以下错误,(调试内核模块时吃过亏又重新编译的内核)所以将其关闭。
Cannot insert breakpoint 1.
Error accessing memory address 0xf90f6000: Unknown error -1.
      位置:---->Kernel hacking
         ---->Set loadable kernel module data as NX and test as RO.
         //必须使能的选项
     (5)CONFIG_KGDB = y   
     位置:---->Kernel hacking     
            ---->KGDB: kernel debugger
     (6)CONFIG_KGDB_SERIAL_CONSOLE = y 使KGDB使用串口进行通信。
     位置:---->Kernel hacking      
        ---->KGDB: kernel debugger               
          ---->KGDB: use kgdb over the serial console
     (7)其余:
     在Kernel hacking-->KGDB: kernel debugger目录下,除了KGDB:internal test suite外的选项全部使能y。

      7.编译内核 执行make, 完成之后关机。

      8.创建第二台虚拟机,名为Fedora-Server-target, 从前面一台克隆如下所示

   

      9. 克隆完成之后,打开“编辑虚拟机设置”,更改串口配置如下所示:

  

     10. 测试串口通信,现在VMware 有两台虚拟机了,Fedora-Server-target和Fedora-Client-host,现在将这两台虚拟机启动起来。

     在Fedora-Server-target端 执行 cat /dev/ttyS1 【之所以是ttyS1是因为上图的管道为com_1】

     在Fedora-Client-host端执行      echo qwerrttt > /dev/ttyS1 【之所以是ttyS1是因为上图的管道为com_1】

     切换到Fedora-Server-target端, 看是否能看到 qwerrttt ,看到了就说明串口连接没有问题。

     11. 在Fedora-Server-target安装内核模块,执行make modules_install 模块被安装到 /lib/modules/3.12.1 目录下。

     12. 在Fedora-Server-target安装内核二进制映象文件,执行make install:

  (1)在此过程中,会在/boot目录下生成config-3.12.1 文件,自动生成根文件系统initrd.img-3.12.1 文件,内核映像文件vmlinuz-3.12.1 文件,以及符号表System.map-3.12.1 文件。

  (2)并且会自动修改grub.cfg文件,在该文件中自动添加3.12.1 内核的启动选项。

  (3)注意原来旧内核boot目录下的文件不要删掉,以防新内核启动不了。

  13. 重启Fedora-Server-target,用uname -a命令查看一下内核版本。并再次测试一下串口通信,测试通过后修改/boot/grub2/grub.cfg 在新内核先项里添加kgdbwait kgdboc=1【串口号或ttyS1】,115200【波特率】并把quiet 去掉【显示一些信息,例如波特率】波特率设置命令:stty ispeed 115200 ospeed 115200 -F /dev/ttyS1

  (1)kgdboc=0,9600 :kgdb over console,这里将kgdb连接的console设置为ttyS0,波特率为9600,如果不在内核启动项中配置该参数  

  (2)kgdbwait:使 kernel 在启动过程中等待 gdb 的连接。

  (3)然后重启target,系统就会暂停在kgdbwait处,等待host端的gdb连接。

  14.Fedora-Client-host端

    (1) 进入/usr/work/linux-3.12.1目录下

    (2)gdb vmlinux  //装入未压缩的内核映像

    (3)set remotebaud 9600   //设置串口速率

    (4)target remote /dev/ttyS1 //连接串口1 

     【注意】要确定两台机器在所设置的波特率下要能通信 

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。