linux内核调试环境搭建(VM_Centos+KGDB)

0x00 写在前面

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

此次环境的搭建同之前win_10上搭建windbg的文章不同(Win10+Win_Xp双机联调),Win_Xp中只需要在启动配置中添加调试选项、设置通信串口,就可以开始了,而linux内核调试需要将现有的内核重新编译,且两端都是虚拟机,在这里使用的环境是:
server:VM_Centos_7_x64
client:VM_Centos_7_x64
KGDB

0x01 串口创建

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

服务器端

客户端

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

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

这一步有点类似Win_Xp上添加启动选项,在官网上下载得到的新内核(3.16.82),版本可以自己选择,下载成功后开始编译它。
首先修改makefile中的EXTRAVERSION =为自己的内核取一个新名称,然后在工作目录下执行命令:

make menuconfig
配置选项

进入上面的界面就可以开始对内核进行编译前的配置,其中就包括是不是允许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通过串口通信]

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

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

编译完成后,使用命令:

make modules_install  //开始安装内核模块

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

make install

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

内核安装成功

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

客户端:

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

kgdbwait kgdboc=1,9600  //kgdboc中1表示ttyS1,9600是波特率,还可以使用115200等
添加配置

在终端中输入:

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

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


等待连接
服务器端:

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

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

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

连接成功

当我们想继续让gdb控制客户机时,可以在客户机中输入echo g>/proc/sysrq-trigger,这也就是上面我们开启的魔术G键,回传控制权给gdb。
此时kgdb环境搭建已经完成,跟着大佬的教程,也是遇到了许多问题,记录一下,帮助以后的复现。

接下来就可以使用配置好的环境调试我们自己的模块了。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358

推荐阅读更多精彩内容