1

通过 rs-232 使用 kgdb 调试 Linux 内核需要几个准备步骤。我发现了很棒的文档,但是没有一个完全独立的源代码,它总结了所需的所有步骤,没有解释很长时间,并且已经过测试。并且还涵盖了 Yocto。

是否有任何来源可以在一个简短的描述中涵盖所有所需的内容?

IE:

  • 启动 GDB 的目录中需要哪些文件(例如内核感知、源代码、vmlinux)以及如何获取这些文件,放在哪里?
  • 何时何地从哪里获得跨 gdb?
  • 需要所有内核配置选项,也包括不明显的选项(如 CONFIG_RANDOMIZE_BASE)
  • 如何配置串口
  • 解释闯入被调试者和调试器以开始的来回工作。
  • 解释停止到处运行的内核的一种坚如磐石的选择。
  • 解释如何完成这项工作,不仅适用于 PC-PC 调试,还适用于 Yocto 目标。
4

1 回答 1

3

通过 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”获取命令列表。

于 2020-04-17T17:39:25.947 回答