用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

时间: 2024-12-08 23:20:49

用KGdb和VMware调试Linux内核,System Call的相关文章

VELT-0.1.5开发:使用kgdb调试Linux内核【转】

转自:http://demo.netfoucs.com/lights_joy/article/details/44106589 VELT的全称是Visual EmbedLinuxTools,它是一个与visual gdb类似的visual studio插件,用以辅助完成Linux开发.利用这个插件,将可以在visual studio的IDE中进行Linux应用程序的开发(包括编译和调试),也可以进行uboot和linux内核的编译,并根据编译时的错误信息正确定位到源码.目前的版本是0.1.4,仅

使用 ftrace 调试 Linux 内核【转】

转自:http://blog.csdn.net/adaptiver/article/details/7930646 使用 ftrace 调试 Linux 内核,第 1 部分 http://blog.csdn.net/tommy_wxie/article/details/7340701 简介: ftrace 是 Linux 内核中提供的一种调试工具.使用 ftrace 可以对内核中发生的事情进行跟踪,这在调试 bug 或者分析内核时非常有用.本系列文章对 ftrace 进行了介绍,分为三部分.本文

Linux 内核的测试和调试(1)

Linux 内核的测试和调试(1) Linux 内核测试哲学 不管是开源还是闭源,所有软件的开发流程中,测试是一个重要的.不可或缺的环节,Linux 内核也不例外.开发人员自测.系统测试.回归测试.压力测试,都有各自不同的目的,但是从更高一个层次上看,这些测试的最终目的又是一样的:保证软件能一直运行下去,当有新功能加进去时,要保证新功能可以正常工作. 在软件释出 release 版之前,不用回归测试就能保证稳定性,并且尽量避免在软件发布后被用户发现 bug.调试被用户发现的 bug 是一项非常浪

Linux内核爆出远程DoS漏洞CVE-2017-6214 目前只看到4.9.11不受影响

Linux内核近期漏洞频出.今天SecurityFocus又公开了Iinux远程DoS漏洞,攻击者可以利用漏洞使Linux内核进入无限循环,进而导致拒绝服务.这个很容易形成DDoS攻击的,建议大家小心. 受影响范围 受影响的版本一大堆,看下面的列表,不受影响的只给出了一个 Linux kernel 4.9.11,各版本的补丁,见这里 https://www.kernel.org/ 你还可以看看 [下载]Linux内核漏洞分析实战 看看专家是怎么一步步用gdb Kgdb调试linux内核驱动的 B

Linux内核RCE漏洞CVE-2016-10229 Linux kernel 4.5以下版本可能被攻击者利用进行DoS攻击

在早些年,总有人说Linux很安全,但近几个月Linux内核的漏洞屡次出现,在2016年中的时候还爆出 linux内核入侵者被抓获 事实证明linux早就被黑客盯上了 .这次漏洞由于涉及面也不小,绿盟科技发布安全威胁通告. 近日,Linux内核爆出一则高危漏洞(CVE-2016-10229,CNNVD-201703-210),在Linux 4.5之前的系统内核中,当recv以MSG_PEEK标志位被调用时,攻击者可以通过UDP来触发一个不安全的二次校验和计算,以此来远程执行代码,可能导致系统被控

Linux内核DoS漏洞CVE-2016-3140再次出现 Linux kernel 3.10及以下多个版本受影响 目前没有补丁

该Linux内核漏洞涉及Redhat.Oracle.Debian等诸多linux版本,问题出在Linux内核 的 'digi_acceleport.c' 模块上,攻击者利用该漏洞,可能会引发本地拒绝服务攻击.目前看到受影响的最高linux版本是 Linux kernel 3.10 安全加曾经提供过一份Linux内核漏洞分析手册,大家可以再回顾一下 [下载]Linux内核漏洞分析实战 看看专家是怎么一步步用gdb Kgdb调试linux内核驱动的 Bugtraq ID: 84304 Class:

最新Linux内核本地DoS漏洞CVE-2017-8064 4.10.12之前版本均受影响 还有一个CVE-2017-7979

今天SecurityFocus刚刚更新的消息,Linux内核本地拒绝服务漏洞CVE-2017-8064,Linux kernel 4.10.12之前版本全部受影响.攻击者利用该漏洞可以实施本地拒绝服务攻击,但目前没有看到漏洞利用的消息.目前Linux kernel 4.10.12不受影响.另外还有个CVE-2017-7979 也是本地DoS漏洞 近期的两次Linux内核漏洞包括: Linux内核RCE漏洞CVE-2016-10229 Linux kernel 4.5以下版本可能被攻击者利用进行D

xp+WinDBG+VMware调试内核

呵呵,搞点突兀的标题而已.其实说的还是如何使用WinDBG和VMware来搭建调试内核的环境而已,这些网上已经有数不清的教程了,不过我喜欢自己亲手写一下.第一,把这个过程写一遍能加深印象,就算以后忘记了也可以有笔记查找,快速想起来.第二.网上的教程很多都是互相抄来抄去,连错误也抄过去了.很典型一个错误就是Baud Rate,前面还写115200,后面就写成了11520了,狂汗! 按照我这篇笔记写的步骤去做,绝对能够成功,并且还能大略地了解到为什么要这样做的原因.第1部分是步骤,如果不想看原因的,

Linux 内核测试和调试(4)

Linux 内核测试和调试(4) 自动测试工具 这里列出一些能满足不同需求的测试工具供你选择.本小节只是简单介绍个大概,并不提供详细操作指南. AuToTest AuToTest 是一个全自动测试框架,存在的主要目的就是测试 Linux 内核,当然也可以用来测试其他东西,比如测试一块新硬件是否能稳定工作.AuToTest 是开源软件,以 GPL 方式授权,运行于 server-client 架构(即 C/S 架构).你可以通过配置 server 端来对运行了 client 端的系统执行初始化.运