如何使用QEMU和KGDB调试Linux内核?

2023-11-25

我已经能够使用以下方式启动基于 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

主要步骤是:

  1. 使用以下命令编译内核:

    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
    

    其中大部分不是强制性的,但这是我测试过的。

  2. 添加到您的 QEMU 命令:

    -append 'kgdbwait kgdboc=ttyS0,115200' \
    -serial tcp::1234,server,nowait
    
  3. 从 Linux 内核源代码树的根目录运行 GDB:

    gdb -ex 'file vmlinux' -ex 'target remote localhost:1234'
    
  4. In GDB:

    (gdb) c
    

    启动应该完成。

  5. In QEMU:

    echo g > /proc/sysrq-trigger
    

    GDB 应该会崩溃。

  6. 现在我们已经完成了,你可以像往常一样使用GDB:

    b sys_write
    c
    

在 Ubuntu 14.04 中测试。

ARM

无法让它发挥作用。可能与:如何在ARM上使用kgdb?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用QEMU和KGDB调试Linux内核? 的相关文章

随机推荐