基于kgdb调试uos-1060-6026¶
- cpu架构:amd64
基于virt-manager搭建调试环境¶

基于virt-manager可以模拟串口,加快调试环境的搭建,本次宿主机提供的串口设备为/dev/pts/2,x86虚拟机内一般为/dev/ttyS0。
在宿主机上安装minicom、虚拟机上安装cutecom可以测试串口设备通不通。
如果使用的是真实串口设备,宿主机串口设备设别一般为/dev/ttyUSB0,x86被调试机串口设备一般为/dev/ttyS0,arm被调试机串口设备一般为/dev/ttyAMA0。
具体串口请使用minicom、cutecom测试确认。
被调试设备引导参数¶
# Generated by deepin-installer
GRUB_BACKGROUND="/boot/grub/themes/deepin-fallback/background.jpg"
GRUB_CMDLINE_LINUX_DEFAULT="video=efifb:nobgrt splash quiet kgdboc=ttyS0,115200 nokaslr"
GRUB_DEFAULT=0
GRUB_DISTRIBUTOR="`/usr/bin/lsb_release -d -s 2>/dev/null || echo UOS 20`"
GRUB_THEME="/boot/grub/themes/deepin-fallback/theme.txt"
GRUB_TIMEOUT=1
GRUB_GFXMODE=1024x768
DEEPIN_GFXMODE_DETECT=1

如果想在内核引导阶段调试,在上图红框中增加kgdbwait参数即可。
BOOT_IMAGE=/boot/vmlinuz-4.19.0-amd64-desktop root=UUID=586655c5-5cd3-421c-a1b5-e1b1b2b9e545 ro video=efifb:nobgrt splash quiet kgdboc=ttyS0,115200 nokaslr DEEPIN_GFXMODE= ima_appraise=off libahci.ignore_sss=1
不想修改引导参数¶
echo "ttyS0,115200" > /sys/module/kgdboc/parameters/kgdboc
这种方式最简单,可以不重启机器调试内核。
被调试设备陷入kgdb¶
注意,每次打断点前都要先执行上述命令。
宿主机gdb vmlinux¶
进入内核源码目录后使用gdb vmlinux命令进入gdb:
执行完上述命令后即可通过串口设备连接被调试设备。

打断点¶
宿主机上执行¶
内核编译选项CONFIG_GDB_SCRIPTS = y会在内核源码根目录下生成vmlinux-gdb.py软链接,指向编译内核源码机器的scripts/gdb/vmlinux-gdb.py文件,由于我是在服务器上编译后拷贝到我本机的,需要先删除此链接,然后根据实际源文件新建,具体命令如下:
rm -rf vmlinux-gdb.py
ln -s /home/wujing/code/qemu/amd64/uos/1060/6064/x86-kernel/scripts/gdb/vmlinux-gdb.py vmlinux-gdb.py
使用kgdb提供的额外扩展命令lx-symbols可以加载内核ko模块调试符号,不然断点会显示no source file named ... pending。
被调试机上执行¶
段点命中¶

