zoukankan      html  css  js  c++  java
  • 搭建virtualbox + kgdb内核调试环境


    http://blog.chinaunix.net/uid-27033491-id-3260904.html

    http://blog.chinaunix.net/uid-27033491-id-3274496.html


          学习linux内核,调试内核是比不可少的环节,下面就介绍如何搭建调试环境。本文是傻瓜式地说明过程,
    主要是为了供一些初学者参考。本人也是初学者,知道傻瓜式的东西就是好。

    -----------------------------------------------------------
    一,先总体说下,必备的环节有哪些?
         1,安装virtualbox虚拟机。我用的主机环境是ubuntu11.04,虚拟机时ubuntu10.04.
         2,开启virtualbox虚拟机的增强功能。(主要是为了设置共享文件夹)
         3,设置虚拟机与主机之间共享文件夹。(因为后面需要在虚拟机中编译内核)
         4,设置虚拟机和主机之间的串口通信。(两个OS之间需要通信)
    -----------------------------------------------------------
    二,安装virtualbox。
       2.1,首先在virtualbox官网下载一个软件包
                  下载网址: https://www.virtualbox.org/wiki/Linux_Downloads
                   我下载的是:virtualbox-4.1_4.1.16-78094~Ubuntu~natty_i386.deb------------------------------------------------------------------------------------------------
         2.2,使用sudo dpkg -i virtualbox-4.1_4.1.16-78094~Ubuntu~natty_i386.deb安装。
                  安装过程出现需要一些依赖,见下图,这是我安装时出现的。
                   
            解决方法:sudo apt-get install -f 
    -------------------------------------------------------------------------------------------------------------------
    三,设置virtualbox的增强功能及其共享文件夹。
             参考:http://blog.chinaunix.net/uid-27033491-id-3267228.html
    四,设置virtualbox和主机的串口通信。
            参考:http://blog.chinaunix.net/uid-27033491-id-3267248.html
    --------------------------------------------------------------------------------------------------------------------


    在搭建好virtualbox之后开始如下工作。

    1.在虚拟机virtualbox中编译新的内核。
       新的内核要支持kgdb,必须要配置内核选项。执行make menuconfig后的配置选项参考如下:
       <1>KGDB必须使能的内核选项:

    1. CONFIG_EXPERIMENTAL = y
    2.  Location:
    3.     -> General setup
    4.      -> Promptfor development and/or incomplete  code/drivers
    1. CONFIG_KGDB = y
    2.  Location:
    3.     -> Kernel hacking
    4.      -> KGDB: kernel debugger
    1. CONFIG_KGDB_SERIAL_CONSOLE = y (使用串口进行通信)
    2.  Location:
    3.     -> Kernel hacking
    4.      -> KGDB: kernel debugger
    5.               -> KGDB: use kgdb over the serial console
      <2>建议关闭的选项
    1. CONFIG_DEBUG_RODATA = n
    2. 该选项是将内核的一些内存区域空间设置为只读,这样可能导致kgdb的
    3. 设置软断点功能失效。所以推荐将该选项关闭。
    4.  
    5. Location:
    6.      -> Kernel hacking
       <3> 建议打开的选项
    1. CONFIG_KGDB_LOW_LEVEL_TRAP = y
    2. 使能该选项可以kgdb不依赖notifier_call_chain()机制来获取断点异常,
    3. 这样就可以对notifier_call_chain()机制实现相关的函数进行单步调试。
    4. Depends on: KGDB[=y]&& (X86 [=y]|| MIPS [=MIPS])
    5. Location:
    6.      -> Kernel hacking
    7.        -> KGDB: kernel debugger(KGDB [=y])
    1. CONFIG_DEBUG_INFO = y
    2. 该选项可以使得编译的内核包含一些调试信息,使得调试更容易。
    3. Location:
    4.      -> Kernel hacking
    1. CONFIG_FRAME_POINTER = y
    2. 该选项将使得内核使用帧指针寄存器来维护堆栈,从而就可以正确地执行堆栈回溯,即函数调用栈信息。
    3. Location:
    4.      -> Kernel hacking
    1. CONFIG_MAGIC_SYSRQ = y(如果你选择了KGDB_SERIAL_CONSOLE,这个选项将自动被选上)
    2. 激活"魔术 SysRq". 该选项对kgdboc调试非常有用,kgdb向其注册了‘g’魔术键来激活kgdb 。
    3.  
    4. Location:
    5.      -> Kernel hacking
    ---------------------------------------------------------------------------------------------------------------------------
    2,编译内核。参考:http://blog.chinaunix.net/uid-27033491-id-3233389.html
      编译内核完成后,将vmlinux文件通过共享文件夹copy到主机上,供gdb调试用.
    ---------------------------------------------------------------------------------------------------------------------------
    3,编译好内核后,需要修改grub。(我编译使用的内核是2.6.39.4)
      ...
     linux    /boot/vmlinuz-2.6.39.4 root=UUID=3f02ad87-4327-4bc2-96bd-617d56bf8a68 ro  kgdb=ttyS0,115200 kgdboc=ttyS0,115200  kgdbwait
     ...

    内核启动时将会等待主机使用target remote...进行远程链接。见下图。

    ---------------------------------------------------------------------------------------------------------------------------
    4.然后在主机上进行远程链接,这就需要使用串口了。
       首先在主机执行如下命令。
       $socat -d -d /tmp/vbox  pty:
        注意:/tmp/vbox是创建串口通信时的主机有名管道。

    执行该命令后,进入死循环,记住远程链接的参数 /dev/pts/3 然后另开一终端,使用gdb进行远程
    链接。

    如上kgdb_breakpoint函数就是内核的第一个断点。接下来就可以调试了。

    -----------------------------------------------------------------------------------------------------------------------

    参考:http://www.kgdb.info/kgdb/use_kgdb/enable_kgdb_option/
               http://fotis.loukos.me/blog/?cat=8§

             





  • 相关阅读:
    Python中os与sys两模块的区别
    单线程爬取图片
    linux下glances服务器监控工具
    python中的join()函数的用法
    python的exec、eval详解
    mongodb启动不了解决方法
    生产者和消费者(.net实现)
    IOS开发--第一阶段--导行(1)(基本概念)
    12.26 linux基本操作指令
    12.25
  • 原文地址:https://www.cnblogs.com/ztguang/p/12645768.html
Copyright © 2011-2022 走看看