linux内核调试(win+VM+Centos+KGDB)

0 写在前面

遥想自己上次写内核代码的时候不少死机的情况,当时使用的调试方式只能是“插桩法”,printk各种调试信息,才能判断是哪句代码有了问题,但是对于内核来说,这种方式还是很不好用,有的模块在安装时因为功能实现的不同,导致机器直接卡死,还是有着不少困难,直到系统的学习Linux内核编程时才接触到内核调试这一说法,当然,对自己模块的调试也是建立在内核调试的基本环境上的,现将有关内核调试的环境搭建做一个记录,为以后免去小麻烦。

linux内核调试需要将现有的内核重新编译,且两端都是虚拟机,在这里使用的环境是:
  server:VM_Centos_7_2003_x64
  client: VM_Centos_7_2003_x64
  KGDB

1 串口创建

要完成环境的搭建,首先需要两个虚拟机之间设置通信串口,在虚拟机设置中添加一个串行端口,两端分别为服务器和客户端,使用的通信端口为com_1(需要在关机状态下添加)。

 

图.服务器端(用作调试器的虚拟机)

 

图.客户端(用作调试目标虚拟机)

设置完成之后在服务端使用cat /dev/ttyS1命令监听串口1中发来的消息,在客户端使用echo helllo!! > /dev/ttyS1 发送一个消息给串口,如果在服务端看到了这个消息,证明成功配置了串口。(一般的linux系统COM_1对应/dev/ttyS0)

 

2 重新编译内核,使其支持KGDB调试

这一步有点类似Win_Xp上添加启动选项,在官网上下载得到的新内核(3.16.82),版本可以自己选择,下载成功后开始编译它。

首先修改makefile中的EXTRAVERSION =为自己的内核取一个新名称,然后在工作目录下执行命令:

make menuconfig

2.1 配置选项

进入上面的界面就可以开始对内核进行编译前的配置,其中就包括是不是允许KGDB调试,在配置时为了支持调试需要选择以下几个选项:

1/Kernel hacking

--->Compile-time checks and compiler options

------>Compile the kernel with debug info

[编译的内核带有调试信息,可以帮助我们调试内核,建议开启]

 

2/Kernel hacking

--->Compile-time checks and compiler options

------>Compile the kernel with frame pointers

[内核使用帧指针寄存器来维护堆栈,可以正确地执行堆栈回溯,建议开启]

 

3/Kernel hacking

--->Magic SysRq key

[注册一个魔术键,使用$ echo"g">/proc/sysrq-trigger来激活KGDB,建议开启]

 

4/Kernel hacking

--->Write protect kernel read-only data structures

[关闭部分内存区域只读保护,建议关闭]

 

5/Kernel hacking

--->Set loadable kernel module data as NX and test as RO.

[内核空间只读选项,建议关闭]

 

6/Kernel hacking

--->KGDB: kernel debugger

[ KGDB内核调试开关,建议开启]

 

7/Kernel hacking

--->KGDB: kernel debugger

------>KGDB: use kgdb over the serial console

[ KGDB通过串口通信]

 

8/General setup

CONFIG_KALLSYMS选项可以在运行时通过name访问符号信息

  General setup —>

    [*] Configure standard kernel features (expert users) —>

       -*- Load all symbols for debugging/ksymoops

[kernel符号]

防止有其他选项漏选,我们可以使用当前内核的/boot/.config文件来追加上面的配置,将它拷贝至我们的工作目录下即可。

设置好编译选项后,使用命令:

make  #开始编译内核。(此过程持续90分钟左右,耐心等候)

编译完成后,使用命令:

make modules_install  #开始安装内核模块

模块安装成功后执行命令安装模块二进制文件:

make install

此时新的内核就已经安装完成了,可以在/boot/grub/文件夹下找到grub.cfg,打开查看里面是不是有了新的内核选项3.16.82。

 

图.内核安装成功

3 配置客户端与服务器端,通过串口调试

3.1 客户端(debugee)

在刚刚打开的grub.cfg中为新的内核倒数第二句话添加

kgdbwait kgdboc=1,9600  # kgdboc中1表示ttyS1,9600是波特率,还可以使用115200等

 

图.添加配置

在终端中输入:

echo ttyS1 > /sys/module/kgdboc/parameters/kgdboc

重启计算机,选择新的内核,就会等待kgdb连接。

 

图.等待远程调试器连接

3.2 服务器端(debuger)

将刚刚编译的文件拷贝至服务器中(如果环境是新的,可以直接复制这个虚拟机),在文件根目录中使用命令:

gdb vmlinux  #载入Linux印象
set remotebaud 9600  #设置传输率
target remote /dev/ttyS1  #设置串口号

连接成功后进入调试状态,使用c命令使客户机继续启动。

 

图.连接成功启动调试

进入调试状态后,输入c客户机就会继续运行,

当需要继续让gdb控制客户机时,可以在客户机中输入echo g > /proc/sysrq-trigger,这也就是上面我们开启的魔术G键,回传控制权给gdb。

 

参考:

【1】https://www.cnblogs.com/zjfdbz/archive/2013/03/15/2961166.html

【2】https://www.jianshu.com/p/41dcdeb6c55b

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值