Chinaunix首页 | 论坛 | 博客
  • 博客访问: 910527
  • 博文数量: 119
  • 博客积分: 2493
  • 博客等级: 大尉
  • 技术积分: 2363
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-03 14:00
文章分类

全部博文(119)

文章存档

2013年(19)

2012年(100)

分类: LINUX

2012-07-15 08:04:25

本文是建立在搭建virtualbox + kgdb内核调试环境(1)之上的。在搭建好virtualbox之后开始如下工作。

1.在虚拟机virtualbox中编译新的内核。
   新的内核要支持kgdb,必须要配置内核选项。执行make menuconfig后的配置选项参考如下:
   <1>KGDB必须使能的内核选项:
  1. CONFIG_EXPERIMENTAL = y
  2.  Location:
  3.     -> General setup
  4.      -> Prompt for 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://fotis.loukos.me/blog/?cat=8§

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