内核必须懂(六): 使用kgdb调试内核

栏目: C · 发布时间: 5年前

内容简介:调试内核肯定不是什么轻松的事情, 这里是使用kgdb进行调试, 你理解的没错, 就是kernel版的gdb.首先克隆下已经重新编译内核的虚拟机 然后设置两者的串口, 这里是用的win, mac端的串口我暂时还弄不太好, 所以很不情愿地用了下win:目标机执行:
  • 前言
  • 虚拟机串口设置
  • 测试串口
  • 配置目标机
  • 开始调试
  • 调试驱动模块
  • 最后

前言

调试内核肯定不是什么轻松的事情, 这里是使用kgdb进行调试, 你理解的没错, 就是kernel版的gdb.

虚拟机串口设置

首先克隆下已经重新编译内核的虚拟机 然后设置两者的串口, 这里是用的win, mac端的串口我暂时还弄不太好, 所以很不情愿地用了下win:

  • 开发机
内核必须懂(六): 使用kgdb调试内核
  • 目标机
内核必须懂(六): 使用kgdb调试内核

测试串口

目标机执行:

sudo cat /dev/ttyS1
复制代码
内核必须懂(六): 使用kgdb调试内核

开发机切换成root用户, 执行:

echo “Hello, world!”>/dev/ttyS1
复制代码
内核必须懂(六): 使用kgdb调试内核

配置目标机

打开grub文件:

sudo vim /etc/default/grub
复制代码

增加如下内容:

GRUB_CMDLINE_LINUX="nokaslr rootdelay=90quiet splash text kgdboc=ttyS1,115200“
复制代码
内核必须懂(六): 使用kgdb调试内核

更新grub:

sudo update-grub
复制代码

nokaslr, 禁止内核地址随机化, 具体内容请自行google:

reboot
复制代码

然后重启的时候, 就能够看到一行关于nokaslr的提示了.

开始调试

然后开始测试一下kgdb的调试, 目标机切换为root用户, 控制权限交给kgdb, 目标机进入假死状态:

echo g > /proc/sysrq-trigger
复制代码

开发机进入自编译内核目录

gdb ./vmlinux
target remote /dev/ttyS1
handle SIGSEGV noprint nostop pass
break sys_clone
c
s
复制代码
内核必须懂(六): 使用kgdb调试内核

这里把断点给到sys_clone, 就是大家熟悉的fork会调用的, 这样基本等一会, 系统就自己调用, 然后进入调试了. 之后就和使用gdb无异了:

内核必须懂(六): 使用kgdb调试内核
内核必须懂(六): 使用kgdb调试内核

调试驱动模块

要调试自己的写的驱动模块, 就有些麻烦了, 首先需要常规的插入模块, 不多说了. 然后这里有个 shell 脚本可以获取下一些所需参数, 主要是用来插入符号参数:

#!/bin/bash
#
# usage: gdbline.sh module_name module_path
#
# This script will outputs an add-symbol-file line suitable for pasting into gdb to examine
# a loaded module.
#
cd /sys/module/$1/sections
echo -n add-symbol-file $2 `/bin/cat .text`
for section in .[a-z]* *; do
	if [ $section != ".text" ]; then
echo " \\"
echo -n " -s" $section `/bin/cat $section` 
	fi
done
echo
复制代码

首先, 需要在目标机make生成.ko文件, 然后将这个.ko文件拷贝至开发机的同名目录下.

然后在目标机插入.ko文件 用shell脚本获取.text, .data, .bss段基址. 如果你不太清楚这些东西, 还是请自行google, 因为如果展开, 篇幅就控制不住了.

内核必须懂(六): 使用kgdb调试内核

目标机切换为root用户, 控制权限交给kgdb, 目标机进入假死状态:

echo g > /proc/sysrq-trigger
复制代码

开发机进入自编译内核目录

gdb ./vmlinux
target remote /dev/ttyS1
handle SIGSEGV noprint nostop pass
复制代码

常规操作之前也说了, 然后就是新的操作, 要用add-symbol-file插入符号信息, 然后输入y确认:

内核必须懂(六): 使用kgdb调试内核

然后把断点打在模块函数DriverWrite中, 开始运行:

内核必须懂(六): 使用kgdb调试内核

切回目标机, 已经不是假死了, 运行用户态程序:

内核必须懂(六): 使用kgdb调试内核

然后开发机就会触发断点:

内核必须懂(六): 使用kgdb调试内核

接下来就和平常使用gdb调试一样了.


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

啊哈!算法

啊哈!算法

啊哈磊 / 人民邮电出版社 / 2014-6-1 / 45.00元

这不过是一本有趣的算法书而已。和别的算法书比较,如果硬要说它有什么特点的话,那就是你能看懂它。 这是一本充满智慧和趣味的算法入门书。没有枯燥的描述,没有难懂的公式,一切以实际应用为出发点, 通过幽默的语言配以可爱的插图来讲解算法。你更像是在阅读一个个轻松的小故事或是在玩一把趣味解谜 游戏,在轻松愉悦中便掌握算法精髓,感受算法之美。 本书中涉及到的数据结构有栈、队列、链表、树......一起来看看 《啊哈!算法》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

MD5 加密
MD5 加密

MD5 加密工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具