是否有关于如何调试已经过测试并包含所有必要步骤的 Linux 内核的从头到尾的简短描述?特别是约克托?
Is there any short A to Z description of how to debug the Linux kernel that has been tested and contains ALL necessary steps ? Esp. for Yocto?
通过 rs-232 使用 kgdb 调试 Linux 内核需要几个准备步骤。我找到了很棒的文档,但没有一个完全独立的来源,并且总结了所有需要的步骤,没有解释很长时间,并且已经过测试。还包括 Yocto。
是否有任何资源可以在一个简短的描述中涵盖所有需要的内容?
即:
- 启动 GDB 的目录中需要哪些文件(例如内核感知、源代码、vmlinux)以及如何获取这些文件,将其放在哪里?
- 何时何地从中获取交叉 gdb?
- ALL 需要内核配置选项,也包括不明显的选项(如 CONFIG_RANDOMIZE_BASE)
- 如何配置串口
- 解释在开始时闯入调试对象和调试器的来回工作。
- 解释停止到处运行的内核的一个可靠选项。
- 解释如何不仅针对 PC-PC 调试,而且针对 Yocto 目标完成此操作。
通过零调制解调器电缆调试 Linux 内核:
我花了一段时间才与 Linux 内核意识完全 运行 建立 kgdb 连接。我在 2020 年与 Ubuntu Eoan(可选:Yocto Warrior)分享我这样做的方法:
测试:
- 从 Intel MacBook 运行 MacOS Catalina 调试基于 linux 的 Intel PC。使用 Homebrew 包“i386-elf-gdb”中的 gdb。(GDB 中没有“-tui”选项)
- 正在从基于 linux 的英特尔 PC 上调试基于 linux 的 ARM 目标(i.mx6、Yocto)。
先决条件:
您需要两台计算机和一根串行零调制解调器电缆。通过在两台主机上启动串行终端(例如屏幕或腻子)来检查电缆,连接到您的串行端口(例如 /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 未设置
(Note for advanced Yocto use, skip if you're debugging a PC:
In yocto I created in my layer a file: recipes-kernel/linux/linux-mainline_%.bbappend with the content:
FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
SRC_URI += "file://kgdb.cfg“
And in files/kgdb.cfg I added the config fragment shown above (without the on ARM unavailable options CONFIG_RANDOMIZE_BASE and CONFIG_FRAME_POINTER)
)
您需要在第二台调试器计算机上,我们称之为“调试器电脑”:
- 完整的内核源代码,与上面编译内核时使用的代码相同。 (如果你就地编译了 .o 和 .ko 对象而不是在构建文件夹中,你最好不要从另一台你调用 make 等的电脑复制目录,但最好再次获取新的源代码。)
- vmlinux 包含符号的文件(位于内核源代码根目录,或内核 make 后最高级别的构建文件夹)。
- vmlinux-gdb.py 内核构建期间创建的文件(也位于最高级别的相同位置。)。
- 文件夹中的所有脚本 scripts/gdb(文件夹脚本位于同一顶层位置。如果您使用专用构建文件夹,请使用那里的脚本文件夹,而不是源文件夹中的脚本文件夹。)
- (高级:如果两台计算机在 CPU 中不匹配,例如 Intel 和 Arm,则跨 gdb 构建。如果您在 Intel/AMD 上,请忽略。)
Note for advanced Yocto use, I did something like (ignore if you debug a 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
Then (ignore if you're on a PC)
yocto bitbake -c populate_sdk [my-image]
Then (still ignore on PC) install the sdk .sh-installation file from your deploy directory on the debugger pc and start the environment as guided by the output of the install script (remember that command), then use "$GDB" for starting the cross-gdb instead of „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”以获取命令列表。
通过 rs-232 使用 kgdb 调试 Linux 内核需要几个准备步骤。我找到了很棒的文档,但没有一个完全独立的来源,并且总结了所有需要的步骤,没有解释很长时间,并且已经过测试。还包括 Yocto。
是否有任何资源可以在一个简短的描述中涵盖所有需要的内容?
即:
- 启动 GDB 的目录中需要哪些文件(例如内核感知、源代码、vmlinux)以及如何获取这些文件,将其放在哪里?
- 何时何地从中获取交叉 gdb?
- ALL 需要内核配置选项,也包括不明显的选项(如 CONFIG_RANDOMIZE_BASE)
- 如何配置串口
- 解释在开始时闯入调试对象和调试器的来回工作。
- 解释停止到处运行的内核的一个可靠选项。
- 解释如何不仅针对 PC-PC 调试,而且针对 Yocto 目标完成此操作。
通过零调制解调器电缆调试 Linux 内核:
我花了一段时间才与 Linux 内核意识完全 运行 建立 kgdb 连接。我在 2020 年与 Ubuntu Eoan(可选:Yocto Warrior)分享我这样做的方法:
测试:
- 从 Intel MacBook 运行 MacOS Catalina 调试基于 linux 的 Intel PC。使用 Homebrew 包“i386-elf-gdb”中的 gdb。(GDB 中没有“-tui”选项)
- 正在从基于 linux 的英特尔 PC 上调试基于 linux 的 ARM 目标(i.mx6、Yocto)。
先决条件:
您需要两台计算机和一根串行零调制解调器电缆。通过在两台主机上启动串行终端(例如屏幕或腻子)来检查电缆,连接到您的串行端口(例如 /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 未设置
(Note for advanced Yocto use, skip if you're debugging a PC: In yocto I created in my layer a file: recipes-kernel/linux/linux-mainline_%.bbappend with the content: FILESEXTRAPATHS_prepend := "${THISDIR}/files:" SRC_URI += "file://kgdb.cfg“ And in files/kgdb.cfg I added the config fragment shown above (without the on ARM unavailable options CONFIG_RANDOMIZE_BASE and CONFIG_FRAME_POINTER) )
您需要在第二台调试器计算机上,我们称之为“调试器电脑”:
- 完整的内核源代码,与上面编译内核时使用的代码相同。 (如果你就地编译了 .o 和 .ko 对象而不是在构建文件夹中,你最好不要从另一台你调用 make 等的电脑复制目录,但最好再次获取新的源代码。)
- vmlinux 包含符号的文件(位于内核源代码根目录,或内核 make 后最高级别的构建文件夹)。
- vmlinux-gdb.py 内核构建期间创建的文件(也位于最高级别的相同位置。)。
- 文件夹中的所有脚本 scripts/gdb(文件夹脚本位于同一顶层位置。如果您使用专用构建文件夹,请使用那里的脚本文件夹,而不是源文件夹中的脚本文件夹。)
- (高级:如果两台计算机在 CPU 中不匹配,例如 Intel 和 Arm,则跨 gdb 构建。如果您在 Intel/AMD 上,请忽略。)
Note for advanced Yocto use, I did something like (ignore if you debug a 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
Then (ignore if you're on a PC) yocto bitbake -c populate_sdk [my-image]
Then (still ignore on PC) install the sdk .sh-installation file from your deploy directory on the debugger pc and start the environment as guided by the output of the install script (remember that command), then use "$GDB" for starting the cross-gdb instead of „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”以获取命令列表。