赞
踩
这里调试的 linux 内核是通过 Linux+SD卡(rootfs)运行的内核
编辑 /home/tyustli/.gdbinit
文件,参考 【GDB】 .gdbinit 文件
set auto-load safe-path /home/tyustli/code/open_source/kernel/linux-6.5.7/.gdbinit
在 linux 源码项目的根目录新建 .gdbinit
文件
target remote localhost:1234
b start_kernel
layout src
c
先启动 linux 内核,让其等待 GDB 连接
# 启动之后等待 GDB 连接
sudo qemu-system-arm -M vexpress-a9 -m 512M -kernel arch/arm/boot/zImage -dtb arch/arm/boot/dts/arm/vexpress-v2p-ca9.dtb -nographic \
-append "root=/dev/mmcblk0 rw console=ttyAMA0" -sd /home/tyustli/code/open_source/busybox/rootfs.ext3 -s -S
# -dtb 指定设备树,否则会失败
在编译 linux 的当前路径输入
arm-none-linux-gnueabihf-gdb vmlinux -se vmlinux
如果没有设置 /home/tyustli/.gdbinit
文件,那么对应的命令为
arm-none-linux-gnueabihf-gdb vmlinux -se vmlinux -x .gdbinit
即指定 .gdbinit 的文件为当前路径。需要注意的是,如果指定了 /home/tyustli/.gdbinit
文件,就不能加 -x .gdbinit
调试界面信息
要想调试 kernel 只需要再添加一个 kernel 的配置即可
{ "version": "0.2.0", "configurations": [ { // qemu 裸机调试配置 "name": "qemu_bare", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/qemu_code/bare/example/0020_mmu/bsp.elf", "args": [], "stopAtEntry": true, "cwd": "${workspaceFolder}/qemu_code/bare", "environment": [], "externalConsole": false, "MIMode": "gdb", "miDebuggerPath": "/home/tyustli/cross_tool/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-gdb", "miDebuggerServerAddress": "localhost:1234", }, { // u-boot 调试配置 "name": "u-boot", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/open_source/u-boot/u-boot", "args": [], "stopAtEntry": true, "cwd": "${workspaceFolder}/open_source/u-boot", "environment": [], "externalConsole": false, "MIMode": "gdb", "miDebuggerPath": "/home/tyustli/cross_tool/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-gdb", "miDebuggerServerAddress": "localhost:1234", }, { // linux kernel 调试配置 "name": "linux_kernel", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/open_source/kernel/linux-6.5.7/vmlinux", "args": [], "stopAtEntry": true, "cwd": "${workspaceFolder}/open_source/kernel/linux-6.5.7", "environment": [], "externalConsole": false, "MIMode": "gdb", "miDebuggerPath": "/home/tyustli/cross_tool/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-gdb", "miDebuggerServerAddress": "localhost:1234", } ] }
有一点需要注意,如果使用 vscode 调试,就不能指定 /home/tyustli/.gdbinit
文件,或者将 /home/tyustli/code/open_source/kernel/linux-6.5.7/.gdbinit
文件的内容清空
先在 start_kernel
打好断点
先启动 linux 内核,让其等待 GDB 连接
# 启动之后等待 GDB 连接
sudo qemu-system-arm -M vexpress-a9 -m 512M -kernel arch/arm/boot/zImage -dtb arch/arm/boot/dts/arm/vexpress-v2p-ca9.dtb -nographic \
-append "root=/dev/mmcblk0 rw console=ttyAMA0" -sd /home/tyustli/code/open_source/busybox/rootfs.ext3 -s -S
启动调试
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。