我已经能够使用以下方式调用 qemu (v1.7.0) 来启动基于 powerpc 的系统(具体来说是 MPC8544DS)
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 的根文件系统。
因为我正在使用 Qemu 的 -s
标志,所以我可以像这样使用 cross 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挡住了?此外,在 Internet 上的示例中,kgdboc 已设置为 ttyAMA0
,我了解到它代表 AMBA
总线,它特定于基于 ARM 的系统。对于 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?
如果您想从头开始快速入门,我在以下位置制作了一个最小的全自动 Buildroot 示例:https://github.com/cirosantilli/linux-kernel-module-cheat/tree/d424380fe62351358d21406280bc7588d795209c#kgdb
主要步骤是:
编译内核:
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
其中大部分都不是强制性的,但这是我测试过的。
添加到您的 QEMU 命令:
-append 'kgdbwait kgdboc=ttyS0,115200' \ -serial tcp::1234,server,nowait
从 Linux 内核源代码树的根运行 GDB:
gdb -ex 'file vmlinux' -ex 'target remote localhost:1234'
在 GDB 中:
(gdb) c
启动应该完成。
在 QEMU 中:
echo g > /proc/sysrq-trigger
GDB 应该会崩溃。
现在我们完成了,您可以照常使用 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/