用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

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

时间: 2024-08-02 02:34:19

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

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

VELT的全称是Visual EmbedLinuxTools,它是一个与visual gdb类似的visual studio插件,用以辅助完成Linux开发.利用这个插件,将可以在visual studio的IDE中进行Linux应用程序的开发(包括编译和调试),也可以进行uboot和linux内核的编译,并根据编译时的错误信息正确定位到源码.目前的版本是0.1.4,仅支持vs2013.此插件可以在CSDN下载频道下载(http://download.csdn.net/detail/lights

用 kGDB 调试 Linux 内核

简介 这个文档记录了用kGDB调试Linux内核的全过程,都是在前人工作基础上的一些总结.以下操作都是基于特定板子来进行,但是大部分都能应用于其他平台. 要使用KGDB来调试内核,首先需要修改config配置文件,打开相应的配置,配置内核启动参数,甚至修改串口驱动添加poll支持,然后才能通过串口远程调试内核. 配置内核 基本配置 在内核配置文件:.config中,需要打开如下选项 CONFIG_KGDB 加入KGDB支持 CONFIG_KGDB_SERIAL_CONSOLE 使KGDB通过串口

Vmware+gdb调试Linux内核——工欲善其事,必先利其器

今天我最终忍受不了qemu的低速跟不可理喻的各种bug,開始寻找新的调试内核的方法.然后想到了Vmware,那么成熟的虚拟机怎么可能调试不了内核.于是尝试了一番,发现结果很的棒!所以立刻奋笔疾书.把这种方法记录下来. 我们这里主要分成几个步骤: 1.vmware和linux的安装 2.vmware编译Linux内核 3.vmware和gdb主机的配置 4.測试 一.vmware和linux的安装 1)VMware for Linux的安装         官网下载地址: https://my.v

大杀招之使用QEMU调试Linux内核代码

Linux内核代码的调试非常麻烦,一般都是加printk, 或者用JTAG调试. 这里的方法是用QEMU来调试Linux内核.因为QEMU自己实现了一个gdb server, 所以可以非常方便的使用gdb来调内核. 这对内核的学习也非常有帮助. 为了尽量不多花时间在QEMU设置上,这里直接使用以下的内核image: http://free-electrons.com/community/demos/qemu-arm-directfb/ 1. QEMU的安装 这个可以自己去QEMU的官网下载编译,

跟踪调试Linux内核的启动过程

跟踪调试Linux内核的启动过程---使用gdb 符钰婧 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ” 本次的实验是使用gdb跟踪调试内核从start_kernel到init进程启动,并分析启动的过程. 1.首先是在实验楼虚拟机上进行调试跟踪的过程. (1) 先构造一个简单的Linux系统 (2) 接下来使用gdb跟踪调试内核 启动(窗口被冻结) 另开一个shell窗口(水平分割)

使用QEMU调试Linux内核代码

Linux内核代码的调试非常麻烦,一般都是加printk, 或者用JTAG调试.这里的方法是用QEMU来调试Linux内核.因为QEMU自己实现了一个gdb server, 所以可以非常方便的使用gdb来调内核. 这对内核的学习也非常有帮助. 为了尽量不多花时间在QEMU设置上,这里直接使用以下的内核image: http://free-electrons.com/community/demos/qemu-arm-directfb/ 1,QEMU的安装 这个可以自己去QEMU的官网下载编译,如果

调试linux内核环境搭建方法(ddd+busybox+qemu+linux3.5.4内核)

环境搭建 1.1.准备工作 (1).qemu虚拟机 (2).busybox软件 (3).linux-3.5.4内核 (4).ddd 调试工具(终端中输入 sudo apt-get install ddd 安装) 1.2.编译内核 (1)建立工作目录:mkdir -p ~/work/qemu (2)切换到此目录:cd ~/work/qemu (3)下载 linux内 核 (4)解压内核:tar -jxvf linux-3.5.4.tar.bz2 (5)切换到linux-3.5.4目录: cd li

【转】TI-Davinci开发系列之六CCS5.2调试Linux内核

上转博文<TI-Davinci开发系列之五CCS5.2使用gdbserver远程调试应用程序> 使用CCS5.2远程调试内核时,只需导入Linux内核源码,而不需要编译内核,也就不会用到交叉编译链,同时不需要使用gdbserver,但需要仿真器XDS560V2,所以Windows和Linux都可以完成,但考虑到Windows CCS5.2软件成熟,bug较少,且Windows易于操作,故本文推荐并主要介绍Windows版CCS5.2调试内核的方法.在介绍远程调试Linux之前,务必保证仿真器X

用qemu调试linux内核

1)dd if=/dev/zero of=./busybox.img bs=1M count=642)mkfs.ext3 busybox.img3)下载busybox,http://www.busybox.net/downloads/#tar jxvf busybox-1.18.0.tar.bz2 (解压busybox压缩包)#cd busybox-1.18.0 (进入到解压后的busybox源码目录)#make menuconfig (配置busybox)注意配置时,一定要选择静态链接选项,该