构架:ARMv8
内核版本:5.14.0-rc5
1kdb和kgdb简介
因为使用gdb调试内核时,不能执行打断点、单步调试以及更改变量等操作,而这种操作是实际调试工作的基石。为了愈加便捷内核调试,社区开发了内核级的调试模块kdb和kgdb硬盘安装linux,通过它们可以实现对内核的在线调试。
其中kdb可以在本机独立运行,当须要执行调试工作时,可通过sysrq命令或按钮等方法步入调试器。之后就可以在调试器中执行打断点、单步调试、修改寄存器、内存,以及查看变量,调用栈等调试命令。
kdb极大地便捷了内核调试工作,但其最大的问题是不能使用符号表,因而给调试工作带来不便。因此内核还提供了kgdb调试方法的支持,在该方法下一共须要两台设备,其中一台为本地的被调试设备,另一台为远程调试主机,它们可通过并口或网口联接。
在该方法中,本地主机的内核运行kgdb模块,而远程主机须要通过gdbattach到本地主机的kgdb上,进而实现对内核的源码级调试。当attach成功后,远程主机上的gdb就可以像调试应用程序一样调试内核。除了可以执行打断点、修改变量等操作,也可以向其导出符号表,进而实现源码级调试。以下为其相应的构架:
若远程主机与目标机通过并口联接,则其调试方法被称为kgdboc,若其通过网口联接,则被称为kgdboe。当前内核中早已支持kgdboc形式,而若要使用kgdboe形式,则须要自动为内核打上相关补丁。因而若未作特殊说明,前面的介绍都将以kgdboc为主
2kdb使用2.1使能kdb
(1)若要使能kdb,内核须要使能以下配置选项:
CONFIG_DEBUG_INFO=y
CONFIG_FRAME_POINTER=y
CONFIG_MAGIC_SYSRQ=y
CONFIG_MAGIC_SYSRQ_SERIAL=y
CONFIG_KGDB_SERIAL_CONSOLE=y
CONFIG_KGDB_KDB=y
CONFIG_KGDB=y
(2)据悉,启动时还须要在命令行中添加kgdboc选项,以指定其所使用的并口,比如:
kgdboc= ttyAMA0,115200
(3)若未在启动参数中添加kgdboc选项,还可以在系统启动后通过如下命令自动添加
echo "ttyAMA0,115200" > /sys/module/kgdboc/parameters/kgdboc
2.2启动kdb
(1)当配置好kdb后,可通过sysrq命令步入kdb,其命令格式如下:
echo g > /proc/sysrq-trigger
(2)据悉,在内核挂死后,系统也会手动步入kdb,因而使用户可以便捷地调试问题。诸如,下例为通过sysrq命令步入自动panic,此时系统会手动步入kdb:
2.3kdb简单使用
(1)查看帮助信息
(2)查看显存的值(md),比如:
(3)更改显存的值(mm),比如:
(4)显示cpu寄存器的内容(rd),比如:
(5)更改寄存器的内容
(6)复印cpu的栈表针
(7)设置断点(bp),比如:
(8)单步调试(ss),比如:
(9)退出kdb(go),比如:
3kgdb使用
若须要使用kgdb远程调试,首先须要配置以上所有的kdb选项linux串口波特率,之后在启动时步入kgdb模式,等待远程host上gdb的联接,以下为详尽使用流程。
3.1目标板步入kgdb模式
(1)若须要调试内核的启动流程,则可以在启动命令行参数中添加以下选项
kgdbwait
它将会在内核启动时,停止在启动流程中,并等待remotehost的联接,以下为其输出:
其实,它只能调试并口和kgdb模块加载完成以后的流程
(2)若不须要调试启动流程,则可后面的流程先步入kdblinux串口波特率,之后再kdb中执行kgdb命令使其步入kgdb模式,并等待remotehost的联接:
3.2host联接目标板
(1)关掉并口终端,以避免并口使用冲突
(2)在host中启动gdb,以arm64构架为例node.js安装linux,其命令如下
aarch64-linux-gnu-gdb vmlinux
(3)设置并口码率,并联接到target上
(gdb) set serial baud 115200
(gdb) target remote /dev/ttyUSB0
其中/dev/ttyUSB0为target的并口设备,在使用时须要依照实际配置值设置
接出来gdb就可以对目标板上的内核执行调试操作了,因为上面早已关掉了并口终端,因而若希望在gdb中能显示内核的log信息,则可在启动命令行参数中加入kgdbcon选项