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

    其中大多数不是强制性的,但这是我测试过的。
  • 添加到您的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/

    10-15 17:27