本文最后更新于:2023年7月12日 下午
基于kgdb调试uos-1060-6026
基于virt-manager搭建调试环境
基于virt-manager可以模拟串口,加快调试环境的搭建,本次宿主机提供的串口设备为/dev/pts/2
,x86虚拟机内一般为/dev/ttyS0
。
在宿主机上安装minicom
、虚拟机上安装cutecom
可以测试串口设备通不通。
1 2
| sudo apt install minicom sudo minicom -s
|
1 2
| sudo apt install cutecom sudo cutecom
|
如果使用的是真实串口设备,宿主机串口设备设别一般为/dev/ttyUSB0
,x86被调试机串口设备一般为/dev/ttyS0
,arm被调试机串口设备一般为/dev/ttyAMA0
。
具体串口请使用minicom
、cutecom
测试确认。
被调试设备引导参数
1 2 3 4 5 6 7 8 9
| # 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
参数即可。
1
| 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
1
| echo g > /proc/sysrq-trigger
|
注意,每次打断点前都要先执行上述命令。
宿主机gdb vmlinux
进入内核源码目录后使用gdb vmlinux
命令进入gdb:
1 2 3 4
| add-auto-load-safe-path . source ./vmlinux-gdb.py set serial baud 115200 target remote /dev/pts/2
|
执行完上述命令后即可通过串口设备连接被调试设备。
打断点
宿主机上执行
内核编译选项CONFIG_GDB_SCRIPTS = y
会在内核源码根目录下生成vmlinux-gdb.py
软链接,指向编译内核源码机器的scripts/gdb/vmlinux-gdb.py
文件,由于我是在服务器上编译后拷贝到我本机的,需要先删除此链接,然后根据实际源文件新建,具体命令如下:
1 2
| 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
。
1
| b sound/core/pcm_native.c:2511
|
被调试机上执行
1
| aplay bensound-sunny.mp3
|
段点命中