您的位置:首页 > 其它

调试番外篇 - KGDB环境搭建与使用

2016-02-16 21:49 411 查看
From: 内核&调试调试

测试环境

宿主机环境:ubuntu 12.04 + linux kernel 2.6.32

目标机环境:ubuntu 12.04 + gdb + minicom

虚拟机:VirtualBox 4.3.10

1、安装VirtualBox

新建一个标准的虚拟机镜像就OK!然后加载ISO一步一步安装就行!(磁盘大小最好稍微大点,大约40G已经相当够用了) 我安装的是ubuntu 12.04 上述已经说明环境!下同

安装完毕后点击设置 如图进行串口设置



说明:这里的com1 即是 系统里面的/dev/ttyS0,然后启动系统 。

2、编译以及安装内核

到内核官网下载你自己需要调试的内核版本!(www.kernel.org)

这里我下的是2.6.32.61

下载完毕解压到一个目录下.. 这里我解压到/opt下 然后解压 执行以下命令(切换root)



然后进行到内核根目录(注意当前目录)



复制现有内核的config 到 当前目录为 .config



执行make menuconfig

注意这里可能会出现

*** Unable to find the ncurses libraries or the
*** required header files.
*** 'make menuconfig' requires the ncurses libraries.
***
*** Install ncurses (ncurses-devel) and try again.
***
make[1]: *** [scripts/kconfig/dochecklxdialog] 错误 1
make: *** [menuconfig] 错误 2


那么就需要执行下面一条命令

sudo apt-get install libncurses5-dev

然后开始配置内核

使能以下选项

Location:
-> General setup
-> Prompt for development and/or incomplete code/drivers
Location:
-> Kernel hacking
-> KGDB: kernel debugging with remote gdb
-> KGDB: use kgdb over the serial console


关闭以下选项

Location:
-> Kernel hacking
->Write protect kernel read-only data struct ures


执行
make -j4
等待大概10分钟 (具体看个人配置)

执行
make modules_install


执行
make install


编译安装已经完毕

3、测试串口通信是否正常

3.1、在目标机执行下面操作



进入阻塞等待状态

3.2、在宿主机 上安装minicom

sudo apt-get install minicom


配置minicom

执行
sudo vim /etc/minicom/minirc.dfl


写入以下内容 (注意这里跟第二步虚拟机环境里的端口文件名一致)



保存 后运行minicom

sudo minicom


输入发送内容可发现串口通信已经OK



4、设置VirtualBox 共享文件夹

当然因为我所用的是VirtualBox 虚拟机,已经自带了一个共享文件夹功能!这里我就使用了! 其实你也可以用tftp sab等服务器都是可以的!

安装VirtualBox 增强包!

设备 –> 安装增强功能

然后会在ubuntu中弹出一个光盘(位置在/media/VBOXADDITIONS*)

找到VBoxLinuxAdditions.run 运行即可!运行完毕后重启虚拟机

设置共享文件夹



自从4.3版本以后 无需在使用mount -t vboxsf kgdb_shared /mnt/shared

这样去挂在到具体的一个目录下了

会自动挂在在/media 目录下 我们使用即可

下面为我里面的东西!



然后在宿主机上查看



我们可以看到内容已经同步了!所以表示共享文件夹已经生效

5、配置 grub

修改grub.cfg



将下面内容修改



修改后为



其实就是删除第131 行 和 155 行

然后在
linux /boot/vmlinuz-2.6.32.61  root=UUID=f8c18f80-7723-470b-98a852566006 ro
后面 和
quiet
前面加以下内容

kgdb=ttyS0,115200 kgdboc=ttyS0,115200  kgdbwait


然后保存退出即可!重启电脑

6、开始调试

重启后会弹出以下启动菜单



选择2.6.32.61

进入会出现以下画面



在宿主机子上进行如下操作

1、socat -d -d /tmp/kernel_test pty:



如果没有socat 则需要执行sudo apt-get install socat 即可

2、gdb vmlinux (此处的vmlinux 即为在第三步虚拟机编译出来的vmlinux

路径为/opt/linux2.6.32.61/vmlinux)



上述可见kgdb_breakpoint() 为第一个kgdb断点

Q & A

a>关于启动不显示启动菜单的问题

需要修改/etc/default/grub

将GRUB_DEFAULT=0

#GRUB_HIDDEN_TIMEOUT=0


修改完后需要执行update-grub

我们都知道自从grub1.2 以后 . 其实也就叫成grub2了

Grub2 将启动模块分为了三部分

/boot/grub/grub.cfg /etc/default/grub /etc/grub.d/

/boot/grub/grub.cfg 再也不像以前一样可以被改得面目全非!

因为有了update-grub or update-grub2

这个命令会重新生成一个模板grub.cfg 是根据/etc/default/grub

所以首先我们改完grub.cfg之后不要使用update-grub

当然.. 如果被你改得面目全非的话!

那你就可以使用这个命令来生成一个正确的grub.cfg

这样便每次开启启动都会显示菜单项目了!

Note:

当然执行完后,我们的上述调试的第六步也许要重新配置哦!

b>Ignoring packet error, continuing…

确定拷贝过来的vmlinux 是否完整(包含符号表等信息)!

By: Keven - 点滴积累
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: