标签:linux linux内核 调试 kernel 虚拟机
Linux的内核和System Call不好调试,参考这里:
http://stackoverflow.com/questions/5999205/cannot-step-into-system-call-source-code
简单来说,如果想在本机调试system call,那么当你进入system call时,系统已经在挂起状态了,那么它又怎样能响应用户的输入?
所以,有一个UML(http://user-mode-linux.sourceforge.net/)的方式,把内核当成一个进程启动,这样就可以在本机调试。
否则,只能通过串口,或者网络等从不同的机器来调试。
自己用KGdb和Vmware虚拟机折腾了下用串口调试Linux system call。总结一下。
首先,在虚拟机里安装好linux系统(注意把硬盘空间选择大点),编绎带Debug信息的内核:
先下载相关的包,及当前内核的源代码,注意用apt-get source下载源代码时,是放在当前目录下的。
mkdir code cd code sudo apt-get dpkg-dev sudo apt-get source linux-image-$(uname -r) sudo apt-get install libncurses5-dev sudo apt-get install bc再配置编绎选项:
sudo make menuconfig会有一个界面,可以自己设置编绎选项。在“Kernel hacking”下, 有KGDB的选项,不过貌似默认都选好了。
执行make编绎,再执行
sudo make make modules_install //编绎模块我编绎花了3,4个小时,编绎出来竟然有11G。。
把这些编绎好的数据复制一份到宿主机上,等下调试的时候要用到。
在Vmware的“Settings”,“Hardware”,点“add",选择”Serial Port“,再”output to socket",在“Socket(named pipe)”里,填上“/tmp/testsocket”。则虚拟机里的串口数据会写到/tmp/testsocket这个文件里。
编绎好了内核,要用新内核,最简单的办法是直接切换到root用户:
make install会自动复制vmlinuz,.config, initrd.img等文件到boot目录下,并默认以新内核启动。
仅以新内核启动还不可以调试,修改/boot/grub/grub.cfg 文件,在"linux"命令下增加kgdb参数,如:
linux /boot/vmlinuz-3.13.0-24-generic root=UUID=xxx-b91d-xxx-839d-xxxxxx ro quiet kgdboc=ttyS1,115200 kgdbwait如果只是不想启动时等待,可以去掉kgdbwait参数。
重启虚拟机,可以发现停在这样的画面上:
先用socat来把虚拟机的串口输出传送到pts上(可以用man pts 查看pts的更多信息)。
用ctrl + alt + f1,进入tty1,再输入下面的命令:
sudo socat -d -d /tmp/testsocket PTY
如果成功的话,我们可以看到类似这样的输出:
successfully connected ... PTY is /dev/pts/14
切换到root用户,进入到从虚拟机复制出来的编绎好的代码目录,执行:
gdb ./vmlinux
如果不加载vmlinux文件的话,则打不了断点。在gdb里再输入
Remote debugging using /dev/pts/14 continue
break sys_open
echo g > /proc/sysrq-trigger
用KGdb和VMware调试Linux内核,System Call,布布扣,bubuko.com
用KGdb和VMware调试Linux内核,System Call
标签:linux linux内核 调试 kernel 虚拟机
原文地址:http://blog.csdn.net/hengyunabc/article/details/24932399