我已经能够使用以下方式启动基于 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。
由于我正在使用-s
标记到 Qemu,我可以使用 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扣住了吗?另外,在互联网上的示例中,kgdboc 已设置为ttyAMA0
我逐渐理解它代表AMBA
特定于基于 ARM 的系统的总线。我们对于 PowerPC 有类似的东西吗?我在这里做错了什么吗?
KGDB + QEMU 一步一步
首先,QEMU的-gdb
选项比 KGDB 更强大,因此您可能想使用它:如何使用GDB和QEMU调试Linux内核?然而,QEMU 是一种使用 KGDB 为实际硬件做准备的简单方法。我已经在以下位置发布了一些 Raspberry Pi KGDB 指针:Linux 内核实时调试,如何完成以及使用哪些工具?
如果您想从头开始快速入门,我在以下位置制作了一个最小的全自动 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'
-
In GDB:
(gdb) c
启动应该完成。
-
In QEMU:
echo g > /proc/sysrq-trigger
GDB 应该会崩溃。
-
现在我们已经完成了,你可以像往常一样使用GDB:
b sys_write
c
在 Ubuntu 14.04 中测试。
ARM
无法让它发挥作用。可能与:如何在ARM上使用kgdb?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)