通过 Nullmodem-Cable 调试 Linux 内核:
我花了一段时间才获得一个完全运行 Linux 内核感知的 kgdb 连接。我在 2020 年与 Ubuntu Eoan(可选:Yocto Warrior)分享我的做法:
经测试:
- 从运行 MacOS Catalina 的 Intel MacBook 调试基于 linux 的 Intel PC。使用 Homebrew 包“i386-elf-gdb”中的 gdb。(在 GDB 中使用“-tui”选项)
- 从基于 linux 的 Intel PC 调试基于 linux 的 ARM 目标(i.mx6、Yocto)。
先决条件:
您需要两台计算机和一条串行 nullmodem 电缆。通过在两台主机上启动串行终端(例如屏幕或油灰)来检查电缆,连接到您的串行端口(例如 /dev/ttyS0 或 /dev/ttyUSB0)并从每个站打印字符到另一个。记住您确认的 /dev/tty 端口。
准备:
您需要在第一台被调试计算机上,我们称之为“目标”:
- 安装了包含符号、kgdb 支持等的特殊内核。
了解如何编译和安装内核并在 make menuconfig 下面的配置中使用。您可以使用 F8 或 menuconfig 中的 / 键搜索符号。(例如wiki.ubuntu.com。在第一段中注意在 apt-get 之前执行 deb-src :)
# CONFIG_SERIAL_KGDB_NMI 未设置
CONFIG_CONSOLE_POLL=y
# CONFIG_DEBUG_INFO 未设置
CONFIG_KGDB=y
CONFIG_KGDB_SERIAL_CONSOLE=y
# CONFIG_KGDB_TESTS 未设置
# CONFIG_KGDB_KDB 没有设置
CONFIG_FRAME_POINTER=y
CONFIG_DEBUG_INFO=y
# CONFIG_DEBUG_INFO_REDUCED 未设置
# CONFIG_DEBUG_INFO_SPLIT 未设置
CONFIG_DEBUG_INFO_DWARF4=y
CONFIG_GDB_SCRIPTS=y
CONFIG_STRIP_ASM_SYMS=y
# CONFIG_RANDOMIZE_BASE 未设置
(注意高级 Yocto 使用,如果您正在调试 PC,请跳过:在 yocto 中,我在我的层中创建了一个文件:recipes-kernel/linux/linux-mainline_%.bbappend,内容为:FILESEXTRAPATHS_prepend := "${THISDIR} /files:" SRC_URI += "file://kgdb.cfg“ 在 files/kgdb.cfg 我添加了上面显示的配置片段(没有 ARM 上不可用的选项 CONFIG_RANDOMIZE_BASE 和 CONFIG_FRAME_POINTER))
您需要在第二台调试器计算机上,我们称之为“调试器 pc”:
- 完整的内核源代码,与上面用于编译内核的代码相同。(如果你在适当的位置编译了 .o 和 .ko 对象,而不是在构建文件夹中,你最好不要从另一台电脑复制目录,你在其中调用了 make 等,但最好再次获取新的源。)
- 包含符号的 vmlinux 文件(位于内核源代码根目录,或内核 make 之后的最高级别的 build 文件夹)。
- 在内核构建期间创建的 vmlinux-gdb.py 文件(也位于最高级别的相同位置。)。
- 文件夹 scripts/gdb 中的所有脚本(文件夹脚本位于相同的顶层位置。如果您使用专用的构建文件夹,请使用那里的脚本文件夹,而不是源文件夹。)
- (高级:如果两台计算机的 CPU 不匹配,例如 Intel 和 Arm,则跨 gdb 构建。如果您使用的是 Intel/AMD,请忽略。)
对于高级 Yocto 使用的注意事项,我做了类似的事情(如果您调试 PC,请忽略):
bitbake -c patch virtual/kernel #(apply the changed kernel config from above)
bitbake -f -c compile virtual/kernel #(unpack is not sufficient because of vmlinux-gdb.py)
mkdir ~/gdbenv
cp -a tmp/work-shared/phyboard-mira-imx6-14/kernel-source/. ~/gdbenv
cp tmp/work/phyboard_mira_imx6_14-phytec-linux-gnueabi/linux-mainline/4.19.100-phy1-r0.0/build/vmlinux ~/gdbenv
cp tmp/work/phyboard_mira_imx6_14-phytec-linux-gnueabi/linux-mainline/4.19.100-phy1-r0.0/build/vmlinux-gdb.py ~/gdbenv
mkdir ~/gdbenv/scripts
cp -r tmp/work/phyboard_mira_imx6_14-phytec-linux-gnueabi/linux-mainline/4.19.100-phy1-r0.0/build/scripts/gdb ~/gdbenv/scripts
然后(如果您使用的是 PC,请忽略)yocto bitbake -c populate_sdk [my-image]
然后(在 PC 上仍然忽略)从调试器 PC 上的部署目录安装 sdk .sh-installation 文件,并按照安装脚本的输出(记住该命令)的指导启动环境,然后使用“$GDB”启动跨 gdb 而不是“gdb”。
调试执行
在调试器上启动两个控制台屏幕:
控制台1、ssh:+++++++++++++++++++++++++++++++++++++++++
ssh user@192.168.x.y
sudo -s
echo ttyS0,9600n8 > /sys/module/kgdboc/parameters/kgdboc
echo 1 > /proc/sys/kernel/sysrq
echo g > /proc/sysrq-trigger
控制台2,本地:++++++++++++++++++++++++++++++++++++++++
cd ~/gdbenv
gdb -tui ./vmlinux
add-auto-load-safe-path ~/gdbenv
source ~/gdbenv/vmlinux-gdb.py
set serial baud 9600
target remote /dev/ttyS0 (use the tty port you confirmed in the beginning)
b [name of the c funtion you want to debug]
cont
回到控制台1,ssh:+++++++++++++++++++++++++++++++++++++++++
[Now trigger the function, e.g. sudo modprobe yourFancyKernelModule]
回到控制台2,本地:++++++++++++++++++++++++++++++++++++++++++
现在使用 gdb 函数,例如 bt、step、next、finish ...
您还可以使用支持 linux 的命令。在 gdb 中调用“apropos lx”获取命令列表。