本文是建立在搭建virtualbox + kgdb内核调试环境(1)之上的。在搭建好virtualbox之后开始如下工作。
1.在虚拟机virtualbox中编译新的内核。
新的内核要支持kgdb,必须要配置内核选项。执行make menuconfig后的配置选项参考如下:
<1>KGDB必须使能的内核选项:- CONFIG_EXPERIMENTAL = y
- Location:
- -> General setup
- -> Prompt for development and/or incomplete code/drivers
- CONFIG_KGDB = y
- Location:
- -> Kernel hacking
- -> KGDB: kernel debugger
- CONFIG_KGDB_SERIAL_CONSOLE = y (使用串口进行通信)
- Location:
- -> Kernel hacking
- -> KGDB: kernel debugger
- -> KGDB: use kgdb over the serial console
<2>建议关闭的选项- CONFIG_DEBUG_RODATA = n
- 该选项是将内核的一些内存区域空间设置为只读,这样可能导致kgdb的
- 设置软断点功能失效。所以推荐将该选项关闭。
-
- Location:
- -> Kernel hacking
<3> 建议打开的选项- CONFIG_KGDB_LOW_LEVEL_TRAP = y
- 使能该选项可以kgdb不依赖notifier_call_chain()机制来获取断点异常,
- 这样就可以对notifier_call_chain()机制实现相关的函数进行单步调试。
- Depends on: KGDB [=y] && (X86 [=y] || MIPS [=MIPS])
- Location:
- -> Kernel hacking
- -> KGDB: kernel debugger (KGDB [=y])
- CONFIG_DEBUG_INFO = y
- 该选项可以使得编译的内核包含一些调试信息,使得调试更容易。
- Location:
- -> Kernel hacking
- CONFIG_FRAME_POINTER = y
- 该选项将使得内核使用帧指针寄存器来维护堆栈,从而就可以正确地执行堆栈回溯,即函数调用栈信息。
- Location:
- -> Kernel hacking
- CONFIG_MAGIC_SYSRQ = y (如果你选择了KGDB_SERIAL_CONSOLE,这个选项将自动被选上)
- 激活"魔术 SysRq"键. 该选项对kgdboc调试非常有用,kgdb向其注册了‘g’魔术键来激活kgdb 。
-
- Location:
- -> 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§
阅读(930) | 评论(0) | 转发(0) |