用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
目录
相关文章
|
XML C# 数据格式
掌握了在Windows平台上查看DLL依赖的方法
掌握了在Windows平台上查看DLL依赖的方法
2882 4
|
JavaScript 前端开发 API
core-js介绍及安装使用
core-js介绍及安装使用
core-js介绍及安装使用
|
4月前
|
机器学习/深度学习 缓存 人工智能
MoE模型加速秘籍:vLLM混合KV缓存管理解析​
vLLM是高效分布式大模型推理引擎,采用分页注意力、连续批处理等技术实现高吞吐与低延迟。本文详解其架构设计与关键技术,包括KV缓存管理、调度机制、推测解码与分布式扩展等,助你深入理解性能优化原理。
907 1
|
6月前
|
C# 图形学 开发者
【Unity3D实例-功能-移动】角色移动-通过WSAD(Rigidbody方式)
本文介绍了如何在Unity中使用Rigidbody组件实现角色自由移动,包括模型准备、组件添加、脚本编写与测试运行,帮助开发者快速掌握基础角色控制技巧。
285 0
|
10月前
|
Oracle 关系型数据库 Java
【YashanDB知识库】Flink CDC实时同步Oracle数据到崖山
本文介绍通过Flink CDC实现Oracle数据实时同步至崖山数据库(YashanDB)的方法,支持全量与增量同步,并涵盖新增、修改和删除的DML操作。内容包括环境准备(如JDK、Flink版本等)、Oracle日志归档启用、用户权限配置、增量日志记录设置、元数据迁移、Flink安装与配置、生成Flink SQL文件、Streampark部署,以及创建和启动实时同步任务的具体步骤。适合需要跨数据库实时同步方案的技术人员参考。
【YashanDB知识库】Flink CDC实时同步Oracle数据到崖山
|
存储 关系型数据库 MySQL
MySQL基础指南:从入门到精通
MySQL基础指南:从入门到精通
388 0
|
开发框架 监控 Kubernetes
CTF本地靶场搭建——GZ:CTF基础使用
GZ::CTF是一个基于ASP.NET Core的开源CTF竞赛平台,支持Docker或K8s容器部署,提供静态和动态题目类型,包括静态附件、动态附件、静态容器和动态容器,具备动态分值功能,如三血奖励和动态flag作弊检测。平台还具有实时通知、邮件验证、用户权限管理、Writeup收集、流量代理转发等功能。此外,它包含比赛管理、队伍管理、用户管理等多个管理模块,适合举办和参与网络安全竞赛。
C#基础③——类型转换(int转double、double转int、Convert)
不同数据类型间的转换,如:将int类型转换为string类型
|
Ubuntu 关系型数据库 MySQL
expect自动交互脚本:简化你的自动化任务
`expect` 是Linux自动化神器,用于模拟键盘输入与交互式应用自动交互,常用于自动登录服务器、执行命令。安装 `expect`(CentOS: `yum -y install tcl expect`, Ubuntu: `apt-get -y install expect`) 后,编写脚本如SSH登录示例,自动发送密码和命令。通过结合shell命令,`expect` 可实现复杂任务,如获取IP、登录MySQL。支持多服务器管理,根据用户输入选择登录。学习 `expect` 提升自动化效率!
1086 0
|
Ubuntu 网络安全 开发者
CTF本地靶场搭建——GZ:CTF安装
GZCTF是一个开源的网络安全竞技平台,由GZTimeWalker维护,提供环境供爱好者和专业人士通过解决CTF题目提升技能。本文档介绍了在Ubuntu 20.04上部署GZCTF的步骤,包括安装操作系统、配置清华镜像源、更新软件、安装Docker和docker-compose,以及根据GZCTF文档创建配置文件并启动服务。完成部署后,用户可在浏览器中看到GZCTF平台。