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

简介:

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
目录
相关文章
|
5月前
|
Ubuntu Linux
Win10 Ubuntu子系统(内嵌ubuntu18.04)运行32bit Linux原生程序 解决Exec format error错误
Win10 Ubuntu子系统(内嵌ubuntu18.04)运行32bit Linux原生程序 解决Exec format error错误
119 0
|
3月前
|
存储 Ubuntu 关系型数据库
在Windows WSL (Linux的Windows子系统)上运行的Ubuntu 20.04安装Bacula失败
Bacula 是一个开源的跨平台网络备份工具,提供基于客户端/服务器(CS)架构的企业级备份解决方案。它支持对数据进行备份、恢复以及完整性校验,并且可以运行在多种操作系统上,包括 Windows 和 Linux 等。
23 0
|
5月前
|
Linux Shell C语言
|
5月前
|
网络协议 Linux 网络安全
Linux 利用 qemu-system-aarch64 实现 x86 机器安装 arm64 的操作系统 2
Linux 利用 qemu-system-aarch64 实现 x86 机器安装 arm64 的操作系统
91 0
|
5月前
|
存储 编解码 Linux
Linux 利用 qemu-system-aarch64 实现 x86 机器安装 arm64 的操作系统 1
Linux 利用 qemu-system-aarch64 实现 x86 机器安装 arm64 的操作系统
213 0
|
8月前
|
安全 Linux Shell
探索Linux中的`system()`系列函数
Linux操作系统提供了一系列`system()`系列函数,允许程序在运行时执行外部命令。本文将深入介绍这些函数的用法、工作原理以及潜在的风险,以帮助读者更好地理解如何在程序中使用这些函数。
169 1
|
9月前
|
运维 监控 Ubuntu
linux部署的几种方法
linux服务器运维相关经验命令
148 0
|
Ubuntu Linux 编译器
Linux运行在I.M6ULL嵌入式开发板配置
Linux运行在I.M6ULL嵌入式开发板配置
266 0
Linux运行在I.M6ULL嵌入式开发板配置
成功解决解决VM软件安装Linux的Ubuntu过程,开启Linux出现Oprating System not found错误
成功解决解决VM软件安装Linux的Ubuntu过程,开启Linux出现Oprating System not found错误
成功解决解决VM软件安装Linux的Ubuntu过程,开启Linux出现Oprating System not found错误
|
监控 安全 Unix
关于LR监视Windows和linux的说明
一、监控windows系统: 1、监视连接前的准备工作 1)进入被监视windows系统,开启以下二个服务Remote Procedure Call(RPC) 和Remote Registry Service (开始—)运行 中输入services.msc,开启对应服务即可)。
1161 0