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

今天我终于忍受不了qemu的低速跟不可理喻的各种bug,开始寻找新的调试内核的方法。然后想到了Vmware,那么成熟的虚拟机怎么可能调试不了内核。于是尝试了一番,发现结果非常的棒!所以立马奋笔疾书,把这个方法记录下来。

         我们这里主要分成几个步骤:

                                                         1、vmware和linux的安装

                                                         2、vmware编译Linux内核

                                                         3、vmware和gdb主机的配置

                                                         4、测试


一、vmware和linux的安装

1)VMware for Linux的安装

        官网下载地址:

              https://my.vmware.com/web/vmware/details?downloadGroup=WKST-1002-LX&productId=362&rPId=5404

              注:官网下载需要进行注册在太平洋等网站可以找到,但由于csdn博客url限制问题不能列出。

        下载完成之后,chmod a+x filename,然后在终端./filename运行安装程序。接下来和win下的安装基本一样,这里不作详细介绍。

2)Linux虚拟机的安装

        安装完vmware之后,我们在虚拟机上安装Linux系统。并在接下来的(二)中,在Linux虚拟机上编译新的内核。这里的安装和物理机安装基本事一样的,但是有点小技巧。由于我们接下来需要在Linux虚拟机上编译内核,所以这里建议安装Development,因为编译的时候不仅需要make还需有其他库的支持。我相信没有愿意在虚拟机里面再配一次yum源的。

        所以我们在创建虚拟机的时候,需要选择创建之后安装系统:

       

           虚拟机创建完成后,通过虚拟机的setting属性。设置光盘挂载镜像:

        

          然后启动虚拟机,就可以进行安装。


二、vmware编译Linux内核

         1)共享文件夹的制作

          首先选择右键中的install vmware tool,将自动把vmware tool的安装文件挂载到光盘。我们把里面的.tar.gz

文件拿出来,解压并且执行里面的安装文件。一路enter就ok了

          然后我们在setting中继续如下的设置:

         

         上图的意思是虚拟机中/mnt/hgfs/HostFile 文件对应主机中/home/sleipnir/Documents文件实现共享

         2)内核编译

         内核下载:www.kernel.org

         我的版本是2.6.32.62。不同的版本编译的方法事有一些差异的,比如2.6.32.61需要修改arch/x86/include/asm/ptrace.h的代码,不然编译会报错。下载下来之后,我们进行解压,然后利用menuconfig进行模块的选择,最后编译。具体的命令行如下:

         tar xvf kernel-file.tar.gz       //解压

         cd kernel-file

         make menuconfig               //利用menuconfig进行模块定义,具体在前面几篇文章中进行了介绍

         make -j4 all                          //编译-j4是使用多线程编译,如果散热不好的机子不建议使用。过热会导致重启

         make bzImage                     //压缩内核

         make modules                     //编译模块

         make modules_install        //安装模块

         make install                         //安装内核

注意:make install的时候,如果报错ERROR:modinfo:could not find module XXXX可以不用管。reboot之后新内核可以正常运行。至于原理我们这里提供一篇文章进行解释:

               

三、vmware和gdb主机的配置

       完成了上面步骤之后,我们需要对虚拟机做2步配置

       1)将虚拟机上内核的编译文件夹拷贝到主机的相同路径下面。比如虚拟机上的编译文件在/usr/kernel/linux-2.6.32.62。那这里我们需要在主机的相同路经中把linux-2.6.32.62拷贝过来。拷贝的方法可以利用上面的共享文件夹。

       2)在主机上,配置vmware虚拟机的配置文件。配置文件在虚拟机的安装文件夹中,以.vmx后缀结尾。往后面添加debugStub.listen.guest32="1",如果是64位的机器就改成debugStub.listen.guest64="1"


四、测试

       1)在主机上打开Vmware(注:暂时不需要打开虚拟机)

       2)在主机上,进入到内核编译文件夹(刚刚从虚拟机拷贝过来的)

       3)gdb进入调试模式

       4)(gdb)file vmlinux

             (gdb)target remote localhost:8832(注:这里如果事64位机器则是8864端口)

               然后打开虚拟机

               效果如下:


       5)(gdb)b start_kernel

             (gdb)c

               效果如下:



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: gdb是一个强大的调试工具,可以用于调试Linux内核。使用gdb调试Linux内核需要以下步骤: 1. 编译内核时添加调试信息 在编译内核时需要添加调试信息,可以通过在Makefile中添加以下选项来实现: CONFIG_DEBUG_INFO=y CONFIG_DEBUG_KERNEL=y 2. 启动内核调试 在启动内核时需要添加调试选项,可以通过在grub或者lilo中添加以下选项来实现: debug debug earlyprintk=serial,ttyS0,115200 3. 连接gdb 使用gdb连接内核需要使用kgdb插件,可以通过以下命令加载kgdb插件: modprobe kgdb 然后使用以下命令连接gdb: gdb vmlinux (gdb) target remote /dev/ttyS0 4. 使用gdb调试 连接成功后,可以使用gdb进行调试,例如: (gdb) b start_kernel (gdb) c 这将在内核启动时设置断点,并继续执行内核。当内核执行到断点时,gdb将停止执行并等待命令。 以上是使用gdb调试Linux内核的基本步骤,具体调试方法和命令可以参考gdb文档和Linux内核调试文档。 ### 回答2: gdb是一款功能强大的调试器,在日常的编程开发中得到了广泛应用。然而,gdb调试Linux内核时与调试用户态应用程序时有所不同。调试内核需要使用gdb的特殊功能来处理调试内核的问题。在下面的几个方面中,我将解释如何使用gdb来调试Linux内核。 1. 准备gdb环境 首先需要将gdb环境设置为可以使用内核符号。在编译内核时,需要在Makefile中添加CONFIG_DEBUG_INFO和CONFIG_DEBUG_KERNEL选项,以支持调试信息。此外,还需要安装所需的内核符号,然后通过"sudo sysctl -w kernel.yama.ptrace_scope=0"以解决防止调试器附加的安全机制问题。 2. 加载内核映像 通过gdb来加载内核映像。使用gdb命令"file vmlinux"来加载内核映像,其中vmlinux是含有调试符号的内核镜像文件。 3. 内核断点调试 可以使用gdb设置内核断点,以调试内核时确定内核程序执行过程中的问题。使用gdb命令"b <function>"设置函数断点,而使用"b * <address>"设置指定地址的断点。 4. 调试内核panic 当内核执行时发生错误时,系统会进入panic状态。如果需要调试内核panic,可以使用gdb命令"handle SIGTRAP noprint pass"来设置中断处理。使用"monitor halt"或直接ctrl+c可以停止内核,查看是什么出问题了,并且使用"cont"命令让内核继续运行。 5. 查看内核堆栈 可以使用gdb命令"bt"来查看内核的堆栈,以确定调试内核时的问题。在通过gdb调试内核处理内核问题时,内核堆栈非常有用。 总的来说,使用gdb调试Linux内核需要更多的操作方式和技巧,但是如果熟练掌握gdb的某些功能和命令,并且了解内核基本结构和运行机制,就可以高效地调试内核出现的问题。 ### 回答3: GDB(GNU调试器)是一个强大的调试工具,也可以用来调试Linux内核。但是,与调试应用程序或用户空间程序相比,内核调试可能会更加复杂。下面是关于如何使用GDB调试Linux内核的一些指南和步骤。 1.编译内核 为了调试内核,首先需要编译内核并安装它。在编译内核时,需要启用符号表。使用如下命令: $ make menuconfig 在Kernel hacking中设置Debug kernel,这将启用符号表的编译。然后使用命令“make”编译内核并安装它。 2.配置调试环境 在内核启动时,启用调试合适的调试器非常重要。例如,可以使用串线调试器而不是控制台输出,因为调试信息可能无法立即打印到控制台。可以通过UART控制台或JTAG调试器进行调试,这通常比控制台输出更可靠。 3.使用GDB连接到内核 使用GDB的第一步是启动GDB,同时指定内核映像文件作为第一个参数。例如,如果内核映像文件为”vmlinuz”,可以使用如下命令连接GDB到内核: $ gdb vmlinuz 然后,需要设置GDB的默认连接地址: add-symbol-file /path/to/kernel/vmlinux 0xADDRESS 这里的ADDRESS 应该是编译内核时已知的地址。可以在内核映像文件的/System.map文件中找到地址信息。 4.使用GDB调试 在连接GDB到内核后,可以使用GDB来单步执行内核代码或设置断点。可以使用GDB的“step”命令来进入下一个函数调用,并使用“next”命令来执行下一行代码。还可以使用“break”命令设置断点,以捕获特定的行动或事件。 也可以在调试内核时使用一些GDB的调试命令,例如:“watch”命令用于设置监视点,以监视变量的值,而不必停止调试器。可以使用“info” 命令,以获取关于调试目标状态的信息。 总之,调试Linux内核需要仔细的计划和准备。在内核源代码中随时插入代码并编译并不是一个高效的方法。使用GDB可以更轻松地捕获和解决内核的问题。通过使用GDB,可以提高软件开发的效率,并确保Linux内核的稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值