用KGdb和VMware调试Linux内核,System Call

简介: Linux的内核和System Call不好调试,参考这里:http://stackoverflow.com/questions/5999205/cannot-step-into-system-call-source-...

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

虚拟机已经在暂停,等待我们的连接了。

先用socat来把虚拟机的串口输出传送到pts上(可以用man pts 查看pts的更多信息)。

用ctrl + alt + f1,进入tty1,再输入下面的命令:

sudo socat -d -d /tmp/testsocket PTY

如果成功的话,我们可以看到类似这样的输出:

successfully connected ...
PTY is /dev/pts/14

用gdb连接pts,并调试

切换到root用户,进入到从虚拟机复制出来的编绎好的代码目录,执行:

gdb ./vmlinux


如果不加载vmlinux文件的话,则打不了断点。在gdb里再输入

Remote debugging using /dev/pts/14
continue

然后可以看到虚拟机里的linux开启正常启动了。
注意,如果是想在system call上打断点,则要在原来函数名前加上“sys_”。如
break sys_open

在gdb里输入continue之后,发现没有办法再打断点了,可以在虚拟机里以root用户执行:
echo g > /proc/sysrq-trigger

这样就可以让虚拟机暂停,在宿主机的gdb里可以重新操作了。

参考:

http://www.opensourceforu.com/2011/03/kgdb-with-virtualbox-debug-live-kernel/#
http://www.eetop.cn/blog/html/21/766721-25573.html
http://blog.csdn.net/u011839461/article/details/12002075
http://wenku.baidu.com/view/baf6af3f0912a21614792996.html
http://my.oschina.net/fgq611/blog/113249
http://blog.csdn.net/star_xiong/article/details/17357821

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
15小时前
|
NoSQL Ubuntu Linux
【操作系统】实验三 编译 Linux 内核
【操作系统】实验三 编译 Linux 内核
3 1
|
2天前
|
Linux Windows 编译器
|
3天前
|
存储 算法 Linux
【Linux】线程的内核级理解&&详谈页表以及虚拟地址到物理地址之间的转化
【Linux】线程的内核级理解&&详谈页表以及虚拟地址到物理地址之间的转化
|
3天前
|
安全 Linux
【Linux】详解用户态和内核态&&内核中信号被处理的时机&&sigaction信号自定义处理方法
【Linux】详解用户态和内核态&&内核中信号被处理的时机&&sigaction信号自定义处理方法
|
3天前
|
存储 Linux
【Linux】对信号产生的内核级理解
【Linux】对信号产生的内核级理解
|
3天前
|
消息中间件 算法 Linux
【Linux】对system V本地通信的内核级理解
【Linux】对system V本地通信的内核级理解
|
4天前
|
Linux 编译器 调度
xenomai内核解析--双核系统调用(二)--应用如何区分xenomai/linux系统调用或服务
本文介绍了如何将POSIX应用程序编译为在Xenomai实时内核上运行的程序。
20 1
xenomai内核解析--双核系统调用(二)--应用如何区分xenomai/linux系统调用或服务
|
4天前
|
算法 Linux 调度
xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(一)--实时端socket创建流程
xenomai与普通linux进程之间通讯XDDP(一)--实时端socket创建流程
9 1
xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(一)--实时端socket创建流程
|
4天前
|
Linux 调度 数据库
|
4天前
|
存储 缓存 Linux
xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(三)--实时与非实时数据交互
本文介绍了Xenomai中的XDDP(Xenomai Distributed Data Protocol)通信机制,XDDP用于实时和非实时进程之间的数据交换。XDDP在Xenomai内核中涉及的数据结构和管理方式,以及创建XDDP通道后的实时端和非实时端连接过程。
8 0
xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(三)--实时与非实时数据交互