我已经能够使用以下方式来启动基于PowerPC的系统(具体来说为MPC8544DS)来调用qemu(v1.7.0)
qemu-system-ppc -M mpc8544ds -m 512 -kernel zImage -s -nographic -initrd busyboxfs.img -append "root=/dev/ram rdinit=/bin/sh kgdboc=ttyS0,115200 kgdbwait"
其中zImage是一个自定义的交叉编译Linux内核(v2.6.32),已启用并编译了KGDB(用于调试启动代码),而
busyboxfs.img
是基于busybox的rootfs。由于我在Qemu上使用
-s
标志,因此可以使用跨gdb闯入内核,如下所示:(gdb) target remote localhost:1234
Remote debugging using localhost:1234
mem_serial_in (p=<value optimized out>, offset=5) at drivers/serial/8250.c:405
405 }
但是,如果我删除了
-s
标志并尝试通过/dev/ttyS0
闯入内核,则会给我一个权限被拒绝的错误:(gdb) set remotebaud 115200
(gdb) target remote /dev/ttyS0
permission denied
是因为它被Qemu保留了吗?另外,在互联网上的示例中,kgdboc已设置为
ttyAMA0
,据我所知,它是针对基于ARM的系统的AMBA
总线的代表。我们对PowerPC有类似的东西吗?我在这里做错什么了吗? 最佳答案
KGDB + QEMU分步
首先,QEMU的-gdb
选项严格比KGDB更强大,因此您可能要使用它:How to debug the Linux kernel with GDB and QEMU? QEMU是使用KGDB进行实际硬件准备的一种简便方法。我在以下位置发布了一些Raspberry Pi KGDB指针:Linux kernel live debugging, how it's done and what tools are used?
如果您想从头开始,请在https://github.com/cirosantilli/linux-kernel-module-cheat/tree/d424380fe62351358d21406280bc7588d795209c#kgdb上制作一个最小的全自动Buildroot示例。
主要步骤是:
CONFIG_DEBUG_KERNEL=y
CONFIG_DEBUG_INFO=y
CONFIG_CONSOLE_POLL=y
CONFIG_KDB_CONTINUE_CATASTROPHIC=0
CONFIG_KDB_DEFAULT_ENABLE=0x1
CONFIG_KDB_KEYBOARD=y
CONFIG_KGDB=y
CONFIG_KGDB_KDB=y
CONFIG_KGDB_LOW_LEVEL_TRAP=y
CONFIG_KGDB_SERIAL_CONSOLE=y
CONFIG_KGDB_TESTS=y
CONFIG_KGDB_TESTS_ON_BOOT=n
CONFIG_MAGIC_SYSRQ=y
CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1
CONFIG_SERIAL_KGDB_NMI=n
其中大多数不是强制性的,但这是我测试过的。
-append 'kgdbwait kgdboc=ttyS0,115200' \
-serial tcp::1234,server,nowait
gdb -ex 'file vmlinux' -ex 'target remote localhost:1234'
(gdb) c
并且启动应该完成。
echo g > /proc/sysrq-trigger
而且GDB应该崩溃了。
b sys_write
c
在Ubuntu 14.04中测试。
ARM
无法正常工作。可能与:How to use kgdb on ARM??相关
关于linux - 如何使用QEMU和KGDB调试Linux内核?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22004616/