GDB & KGDB调试

GDB底层 -- ptrace() -> sys_ptrace()
https://zhuanlan.zhihu.com/p/336922639

2.3 GDB断点原理

在某行代码处打一个断点,其实就是将该行代码的汇编 (是指令级别!!!)用INT 3中断指令代替,原来的代码被保存到“断点链表”中。

KGDB 调试原理

安装 KGDB 调试环境需要为Linux内核应用 KGDB 补丁,补丁实现的gdb远程调试所需要的功能包括命令处理、陷阱处理及串口通讯3个主要的部分。 KGDB 补丁的主要作用是在Linux内核中添加了一个调试Stub。调试Stub是Linux内核中的一小段代码,提供了运行gdb的开发机和所调试内核之间的一个媒介。gdb和调试stub之间通过gdb串行协议进行通讯。gdb串行协议是一种基于消息的ASCII码协议,包含了各种调试命令。当设置断点时, KGDB 负责在设置断点的指令前增加一条trap指令,当执行到断点时控制权就转移到调试stub中去。此时,调试stub的任务就是使用远程串行通信协议将当前环境传送给gdb,然后从gdb处接受命令。gdb命令告诉stub下一步该做什么,当stub收到继续执行的命令时,将恢复程序的运行环境,把对CPU的控制权重新交还给内核。

使用:
https://cloud.tencent.com/developer/article/1418056

qemu调试

https://quard-star-tutorial.readthedocs.io/zh-cn/latest/ext1.html

配置

修改内核配置

在linux 5.10版本上,KGDB已经受支持,因此仅需要修改内核配置就可以打开此功能。

CONFIG_KGDB

配置CONFIG_KGDB=y,以启用kgdb功能。

CONFIG_GDB_SCRIPTS

配置CONFIG_GDB_SCRIPTS=y,这样在内核编译时会在根目录生成vmlinux-gdb.py文件,这个python脚本需要在gdb调试时加载,以此提供一些供gdb调试内核的扩展命令,对于调试外部ko文件带来极大的方便。

CONFIG_DEBUG_INFO

配置CONFIG_DEBUG_INFO=y,gdb调试内核需要从vmlinx中加载相关符号信息,但默认的内核编译选项没有-g选项,因此该elf文件将不含有调试信息,调试时看不到源码,仅能做汇编级别的调试跟踪,因此需要配置该选项,打开调试信息(打开后会增大内核文件)。

CONFIG_DEBUG_INFO_DWARF4

配置CONFIG_DEBUG_INFO_DWARF4=y,如果不启用这个选项内核调试信息将不包含DWARF4信息,只能进行一些backtarce的查看,而无法debug变量,打开该选项可以使用(打开后会进一步增大内核文件)。

CONFIG_STRICT_KERNEL_RWX/CONFIG_STRICT_MODULE_RWX

配置CONFIG_STRICT_KERNEL_RWX/CONFIG_STRICT_MODULE_RWX选项关闭,这个选项的存在会对内核代码段进行写保护,因此在使用kgdb时如果进行添加断点操作,目标系统如果不支持硬件断点机制,就必须改写内核代码段来使用断点指令触发软件断点达到目的,而该选项的存在会导致断点指令无法写入,因此需要关闭(关闭后会增加内核所在内存被破坏风险)。

修改内核启动参数

进行如下修改:
- bootargs = "root=/dev/vda2 rw console=ttyS0 earlycon=sbi";
+ bootargs = "root=/dev/vda2 rw console=ttyS0 earlycon=sbi nokaslr kgdboc=ttyS1,115200 kgdbwait";

nokaslr

KASLR是一种安全性的手段,会让代码运行在随机化的地址上,传入nokaslr会关闭这个功能以此方便调试的时候地址匹配vmlinx中的符号信息,不过并不是所有arch都支持KASLR功能的,也许在一些架构上就不支持KASLR,这里传不传这个选项也就无所谓了。

kgdboc

kgdboc用来指定内核调试信息从哪里输出,这里我们使用了ttyS1串口输出,未来gdb便需要连接到对应串口来接收调试数据。

kgdbwait

添加该参数可以让内核启动时准备好数据后等待gdb接入再继续启动内核。

启动调试

完成修改后重新编译内核和设备树文件就可以开始内核调试了,由于我们使用的是qemu模拟器,因此需要打开三个终端。

虚拟机调试目标机

https://blog.csdn.net/weixin_38832162/article/details/115347640

posted @ 2024-03-29 14:25  skyycj  阅读(15)  评论(0编辑  收藏  举报