您的位置:首页 > 其它

Ubuntu8.04(kernel2.6.24-26)下配置Qemu+kgdb调试内核(kernel2.6.36.2)小记

2012-08-03 10:29 507 查看
Ubuntu8.04(kernel2.6.24-26)下配置Qemu+kgdb调试内核(kernel2.6.36.2)小记

Qemu安装:

apt-get install qemu

并从Qemu官网下载linux-0.2.img文件备用

内核编译环境配置:

安装build-essential,命令apt-get install build-essential

安装ncurses-dev(make menuconfig需要),命令apt-get install ncurses-dev

其他的软件包参考源码目录下Documentation/Changes列出的软件列表,没有的就使用apt-get install安装,已有的就使用Ubuntu8.04默认已经安装的版本。isdn4k-utils这个用不着不安装。

内核编译:

配置内核:make defconfig先产生一默认的.config文件,然后make menuconfig有菜单出来后读入先前产生的.config文件,更改一些选项。具体参见:http://www.kgdb.info/kgdb/use_kgdb/enable_kgdb_option/

kgdb内核选项配置

2010年6月28日DDD发表评论阅读评论
从Linux 2.6.25起,KGDB被集成到Linux内核中,这使得kgdb的使用变得简单和轻松。
运行如下命令启动配置内核脚本。
?[Copy
to clipboard]View Code BASH
$ make menuconfig


1 KGDB必须使能的内核选项:

?[Copy
to clipboard]View Code EXPERIMENTAL
CONFIG_EXPERIMENTAL = y

Location:

-> General setup

-> Prompt for development and/or incomplete code/drivers


?[Copy
to clipboard]View Code KGDB
CONFIG_KGDB = y

Location:

-> Kernel hacking

-> KGDB: kernel debugger


?[Copy
to clipboard]View Code KGDB_SERIAL_CONSOLE
CONFIG_KGDB_SERIAL_CONSOLE = y (使用串口进行通信)

Location:

-> Kernel hacking

-> KGDB: kernel debugger

-> KGDB: use kgdb over the serial console


2 其它相关内核选项:

2.1 建议关闭的选项
?[Copy
to clipboard]View Code DEBUG_RODATA
CONFIG_DEBUG_RODATA = n

该选项是将内核的一些内存区域空间设置为只读,这样可能导致kgdb的

设置软断点功能失效。所以推荐将该选项关闭。

Location:

-> Kernel hacking


2.2.2 建议打开的选项
?[Copy
to clipboard]View Code KGDB_LOW_LEVEL_TRAP
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])


关于KGDB_LOW_LEVEL_TRAP的缘由详情,可参考这里
?[Copy
to clipboard]View Code DEBUG_INFO
CONFIG_DEBUG_INFO = y

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

Location:

-> Kernel hacking


?[Copy
to clipboard]View Code FRAME_POINTER
CONFIG_FRAME_POINTER = y

该选项将使得内核使用帧指针寄存器来维护堆栈,从而就可以正确地执行堆栈回溯,即函数调用栈信息。

Location:

-> Kernel hacking


?[Copy
to clipboard]View Code MAGIC_SYSRQ
CONFIG_MAGIC_SYSRQ = y (如果你选择了KGDB_SERIAL_CONSOLE,这个选项将自动被选上)

激活"魔术 SysRq"键. 该选项对kgdboc调试非常有用,kgdb向其注册了‘g’魔术键来激活kgdb 。

Location:

-> Kernel hacking


按上述配置好后,使用vim打开.config文件确认无误。

执行make bzImage命令开始编译内核。

编译完成后开始调试:

复制linux-0.2.img到当前源码的顶层目录,开启一终端窗口并进入源码目录,执行如下命令启动Qemu:qemu -S -kernel ./arch/x86/boot/bzImage -hda linux-0.2.img -append "root=/dev/sda" 注:S为大写

Qemu启动后出一黑色窗口,Ctrl+Alt+2转到该窗口中,输入gdbserver 回车,然后可以看到看到等待远程调试,tcp:1234之类信息,再在当前目录下开启一终端输入gdb
vmlinux,出现类似如下信息(此信息在Ubuntu 11.10所显示, Ubuntu8.04下的信息也几乎差不多):

kendy@kdpc:~/Downloads/linux-2.6.36.2$ gdbvmlinux

GNU gdb (Ubuntu/Linaro 7.3-0ubuntu2)7.3-2011.08

Copyright (C) 2011 Free SoftwareFoundation, Inc.

License GPLv3+: GNU GPL version 3 or later<http://gnu.org/licenses/gpl.html>

This is free software: you are free tochange and redistribute it.

There is NO WARRANTY, to the extentpermitted by law. Type "showcopying"

and "show warranty" for details.

This GDB was configured as"i686-linux-gnu".

For bug reporting instructions, please see:

<http://bugs.launchpad.net/gdb-linaro/>...

Reading symbols from /home/kendy/Downloads/linux-2.6.36.2/vmlinux...done.

(gdb)

然后在(gdb)后输 target remote localhost:1234 回车,出现

Remote debugging using localhost:1234

0x0000fff0 in ?? ()

(gdb)

此时可以设置断点。如bstart_kernel 回车

c 回车即可停在断点处。

补充:如果内核启动后有如下错误信息:

Kernel panic - not syncing:VFS:Unable tomount root fs on unknow-block(x,x)

在使用makemenuconfig配置内核时需要选取支持ext2文件系统(linux-0.2.img使用EXT2?)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: