VMware环境下用kgdb调试内核

2023-10-19 12:18

本文主要是介绍VMware环境下用kgdb调试内核,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

from http://blog.chinaunix.net/u/22617/showart_338509.html

一、kgdb安装

1. 系统配置:
VMware Workstation 5.5.4
Fedora Core 3(2.6.9-1.667)
kgdb-2.4(linux-2.6.15.5)

2. 系统安装:
在虚拟机上安装FC3,然后参照后面的文章,将系统的内核升级到2.6.15.5,命名为“FC3-kgdb-client”。 Clone一个和预装环境一样的系统,选择"Create a full clone",命名为“FC3-kgdb-server”。
分别为两个系统增加一个串口,以"Output to named pipe"方式,其中:
client端选择"this end is the client", "the other end is a virtual machine"
Server端选择"this end is the server", "the other end is a virtual machine"
这里解释一下client和server的区别:
client(development machine):即开发机,用于输入命令(例如设置断点)控制target machine的运行。
server(target machine):也就是被调试的机器了,其运行受到development machine命令的控制。

3. 文件下载:
进入client系统,从网上下载如下源文件。(之所以选择2.6.15.5版本内核,是因为kgdb的patch目前最高只能支持到这个版本)
linux kernel
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.15.5.tar.gz
kgdb patch
http://kgdb.linsyssoft.com/downloads/kgdb-2/linux-2.6.15.5-kgdb-2.4.tar.bz2

4. 安装过程:
解压缩各个包,假设最终kernel和 patch的路径如下:
/usr/src/linux
/usr/src/linux-2.6.15.5-kgdb-2.4

为内核打上kgdb的支持补丁(具体可以参考patch中README,选择需要得patch):
#cd /usr/src/linux
#patch -p1 < ../linux-2.6.15.5-kgdb-2.4/core-lite.patch
#patch -p1 < ../linux-2.6.15.5-kgdb-2.4/i386-lite.patch
#patch -p1 < ../linux-2.6.15.5-kgdb-2.4/8250.patch
#patch -p1 < ../linux-2.6.15.5-kgdb-2.4/eth.patch
#patch -p1 < ../linux-2.6.15.5-kgdb-2.4/i386.patch
#patch -p1 < ../linux-2.6.15.5-kgdb-2.4/core.patch
#patch -p1 < ../linux-2.6.15.5-kgdb-2.4/module.patch
#patch -p1 < ../linux-2.6.15.5-kgdb-2.4/sysrq_bugfix.patch

按正常编译内核流程,进入make menuconfig阶段,除了选择支持vmware中内核编译必须的选项,还需要加上如下内容:


最关键的一条,就是:
Serial port number for KGDB,默认选项是1,需要改为0。

接下来“make bzImage”,等着完成。

下面要做的工作就相对简单一点:
将/usr/src/linux/arch/i386/boot/bzImage和/usr/src /linux/System.map复制到server上,这里使用scp命令复制,假设server的ip是192.168.6.13:
#scp arch/i386/boot/bzImage root@192.168.6.13:/boot/vmlinuz-2.6.15.5-kgdb
#scp System.map root@192.168.6.13:/boot/System.map-2.6.15.5-kgdb

在server上创建symbolic链接:
#ln -s /boot/vmlinuz-2.6.15.5-kgdb /boot/vmlinuz
#ln -s /boot/System.map-2.6.15.5-kgdb /boot/System.map

下面就该修改启动项啦:
#vim /boot/grub/grub.conf
给大家做个参考吧:
default=1
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Fedora Core (2.6.15.5-kgdb)
          root (hd0,0)
          kernel /boot/vmlinuz-2.6.15.5-kgdb ro root=/dev/hda1 kgdbwait kgdb8250=0,115200
title Fedora Core (2.6.15.5)
          root (hd0,0)
          kernel /boot/vmlinuz-2.6.15.5-secos ro root=LABEL=/ rhgb quiet
          initrd /boot/initrd-2.6.15.5-secos.img
title Fedora Core (2.6.9-1.667)
          root (hd0,0)
          kernel /boot/vmlinuz-2.6.9-1.667 ro root=LABEL=/ rhgb quiet
          initrd /boot/initrd-2.6.9-1.667.img

OK, reboot重启吧。

系统引导到
"Uncompressing Linux... OK, booting the kernel."
所有的资料上都说看到
"Waiting for connection from remote gdb..."
才是等待调试状态,我的安装完之后可以看到这句话。当然也有可能只看到前面一句,我把这个版本的kgdb移植到2.6.20上就只显示前面一句话,不过可以用client正常连接。

就可以用client去连接了,在client上:
#cd /usr/src/linux
#gdb ./vmlinux
GNU gdb Red Hat Linux (6.0post-0.20040223.17rh)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.         Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu"...Using host libthread_db library "/lib/tls/libthread_db.so.1".
(gdb) set remotebaud 115200
(gdb) target remote /dev/ttyS0
Remote debugging using /dev/ttyS0
breakpoint () at kernel/kgdb.c:1212
1212                   atomic_set(&kgdb_setting_breakpoint, 0);
warning: shared library handler failed to enable breakpoint
(gdb)

上面“1212 atomic_set(&kgdb_setting_breakpoint, 0);”这一行表明已经连接上了。

二、启动过程中的问题:

1. VFS: Unable to mount root fs on unknown-block(3,1)
错误如下:
------------------------------------------------------------------------------
No filesystem could mount root, tried:    iso9660
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(3,1)
------------------------------------------------------------------------------
解决方法:将“Second extended fs support”和下面ext2和ext3相关选项都编入内核。
File systems->
<*> Second extended fs support
[*] Ext2 extended attributes
[*] Ext2 POSIX Access Control Lists
[*] Ext2 Security Labels
[*] Ext2 execute in place support
<M> Ext3 journalling file system support
[*] Ext2 extended attributes
[*] Ext2 POSIX Access Control Lists
[*] Ext2 Security Labels

2.Warning: unable to open an initial console.
解决方法:在2.6.13之前,将“dev file system support”编入内核
File systems->Pseudo filesystems->
[*] dev file system support
2.6.13之后,需要生成 “initrd”,在client端:
#mkinitrd /boot/initrd-2.6.15.5-kgdb 2.6.15.5
注意:上面命令最后2.6.15.5指的是“/lib/modules/2.6.15”这个目录,如果上面这个命令出错,你查看一下是否有这个目录。
上面命令将在/boot下面生成initrd-2.6.15.5-kgdb这个文件,将其复制到server端:
#scp /boot/initrd-2.6.15.5-kgdb root@192.168.6.13:/boot/ initrd-2.6.15.5-kgdb

修改grub.conf,在“kernel /boot/vmlinuz-2.6.15.5-kgdb ro root=/dev/hda1 kgdbwait kgdb8250=0,115200”这行下面添加“initrd /boot/initrd-2.6.15.5-kgdb”

 三、模块调试
1. gdbmod
首先按上面过程配置好kgdb环境。从kgdb的网站下载gdbmod-2.4,将其改名为gdbmod,然后添加x属性,复制到/bin目录。
#mv gdbmod-2.4 gdbmod
#chmod +x gdbmod
#cp gdbmod /bin

2.编写内核模块和makefile
在client机器上,写了个测试用的内核模块orig,如下:
orig.c
------------------------------------------------
void xcspy_func()
{
      printk("<1>xcspy_func/n");
      printk("<1>aaaaaaaaaaa/n");
}

int xcspy_init()
{
      printk("<1>xcspy_init_module/n");
       
      return 0;
}

void xcspy_exit()
{
      printk("<1>xcspy_cleanup_module/n");
}

module_init(xcspy_init);
module_exit(xcspy_exit);
------------------------------------------------

Makefile
------------------------------------------------
# Comment/uncomment the following line to disable/enable debugging
DEBUG = y


# Add your debugging flag (or not) to CFLAGS
ifeq ($(DEBUG),y)
    DEBFLAGS = -O -g -DSCULL_DEBUG # "-O" is needed to expand inlines
else
    DEBFLAGS = -O2
endif

CFLAGS += $(DEBFLAGS)
CFLAGS += -I$(LDDINC)

ifneq ($(KERNELRELEASE),)
# call from kernel build system

obj-m := orig.o

else

KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD         := $(shell pwd)

modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) LDDINC=$(PWD)/../include modules

endif


clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions

depend .depend dep:
$(CC) $(CFLAGS) -M *.c > .depend

<

BR>ifeq (.depend,$(wildcard .depend))
include .depend
endif
------------------------------------------------

#make
#scp orig.ko root@192.168.6.13:/root

3.开始调试
在client机上:
#cd /usr/src/linux
# gdbmod vmlinux
GNU gdb 6.0
Copyright 2003 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.    Type "show warranty" for details.
This GDB was configured as "i686-pc-linux-gnu"...
(gdb) set remotebaud 115200
(gdb) target remote /dev/ttyS0

设置符号文件的搜索路径(注意:orig后面不能有空格,有空格的话,会搜不到符号,大家都喜欢用tab键,而tab键会自动加空格,一定要记住把空格去掉)
(gdb) set solib-search-path /root/orig

这时在server机器上执行insmod orig.ko,如果正常,在client机上将显示共享库已经加载。

接下来的过程就和用gdb调试应用程序差不多了,大家可以参照gdb user manual。

vmware + kgdb + linux2.6.15内核调试配置

参考文献:
《vmware + kgdb + linux2.6.15内核调试配置》
《Linux 系统内核的调试》
《KGDB Quick Start》
《使用kgdb调试linux内核及内核模块》
《在 VmWare Workstation中编译Linux 2.6.20内核》
《RedHat9.0 内核升级(从2.4.20-8到2.6.18)》
《RHEL4内核升级(从 2.6.9-42.EL到2.6.20.4)》

 

 

这篇关于VMware环境下用kgdb调试内核的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/239699

相关文章

VSCode配置Anaconda Python环境的实现

《VSCode配置AnacondaPython环境的实现》VisualStudioCode中可以使用Anaconda环境进行Python开发,本文主要介绍了VSCode配置AnacondaPytho... 目录前言一、安装 Visual Studio Code 和 Anaconda二、创建或激活 conda

pytorch+torchvision+python版本对应及环境安装

《pytorch+torchvision+python版本对应及环境安装》本文主要介绍了pytorch+torchvision+python版本对应及环境安装,安装过程中需要注意Numpy版本的降级,... 目录一、版本对应二、安装命令(pip)1. 版本2. 安装全过程3. 命令相关解释参考文章一、版本对

国内环境搭建私有知识问答库踩坑记录(ollama+deepseek+ragflow)

《国内环境搭建私有知识问答库踩坑记录(ollama+deepseek+ragflow)》本文给大家利用deepseek模型搭建私有知识问答库的详细步骤和遇到的问题及解决办法,感兴趣的朋友一起看看吧... 目录1. 第1步大家在安装完ollama后,需要到系统环境变量中添加两个变量2. 第3步 “在cmd中

Windows环境下安装达梦数据库的完整步骤

《Windows环境下安装达梦数据库的完整步骤》达梦数据库的安装大致分为Windows和Linux版本,本文将以dm8企业版Windows_64位环境为例,为大家介绍一下达梦数据库的具体安装步骤吧... 目录环境介绍1 下载解压安装包2 根据安装手册安装2.1 选择语言 时区2.2 安装向导2.3 接受协议

SpringBoot基于沙箱环境实现支付宝支付教程

《SpringBoot基于沙箱环境实现支付宝支付教程》本文介绍了如何使用支付宝沙箱环境进行开发测试,包括沙箱环境的介绍、准备步骤、在SpringBoot项目中结合支付宝沙箱进行支付接口的实现与测试... 目录一、支付宝沙箱环境介绍二、沙箱环境准备2.1 注册入驻支付宝开放平台2.2 配置沙箱环境2.3 沙箱

前端bug调试的方法技巧及常见错误

《前端bug调试的方法技巧及常见错误》:本文主要介绍编程中常见的报错和Bug,以及调试的重要性,调试的基本流程是通过缩小范围来定位问题,并给出了推测法、删除代码法、console调试和debugg... 目录调试基本流程调试方法排查bug的两大技巧如何看控制台报错前端常见错误取值调用报错资源引入错误解析错误

linux环境openssl、openssh升级流程

《linux环境openssl、openssh升级流程》该文章详细介绍了在Ubuntu22.04系统上升级OpenSSL和OpenSSH的方法,首先,升级OpenSSL的步骤包括下载最新版本、安装编译... 目录一.升级openssl1.官网下载最新版openssl2.安装编译环境3.下载后解压安装4.备份

在Mysql环境下对数据进行增删改查的操作方法

《在Mysql环境下对数据进行增删改查的操作方法》本文介绍了在MySQL环境下对数据进行增删改查的基本操作,包括插入数据、修改数据、删除数据、数据查询(基本查询、连接查询、聚合函数查询、子查询)等,并... 目录一、插入数据:二、修改数据:三、删除数据:1、delete from 表名;2、truncate

使用C/C++调用libcurl调试消息的方式

《使用C/C++调用libcurl调试消息的方式》在使用C/C++调用libcurl进行HTTP请求时,有时我们需要查看请求的/应答消息的内容(包括请求头和请求体)以方便调试,libcurl提供了多种... 目录1. libcurl 调试工具简介2. 输出请求消息使用 CURLOPT_VERBOSE使用 C

VScode连接远程Linux服务器环境配置图文教程

《VScode连接远程Linux服务器环境配置图文教程》:本文主要介绍如何安装和配置VSCode,包括安装步骤、环境配置(如汉化包、远程SSH连接)、语言包安装(如C/C++插件)等,文中给出了详... 目录一、安装vscode二、环境配置1.中文汉化包2.安装remote-ssh,用于远程连接2.1安装2