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

标签 linux linux-kernel embedded qemu powerpc

我已经能够使用以下方式调用 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

主要步骤是:

  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. 在 GDB 中:

    (gdb) c
    

    启动应该完成。

  5. 在 QEMU 中:

    echo g > /proc/sysrq-trigger
    

    GDB 应该会崩溃。

  6. 现在我们完成了,您可以照常使用 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/

相关文章:

java - 如何检测Linux操作系统是使用KDE还是Gnome环境

linux - 在 Linux 内核中暂停代码执行

python - 如何修复 sh : 1 curl not found

c++ - 在共享缓冲区内存中创建一个::std::string 对象

python - iOS 6 : libpython2. 7.a初始化导入错误

c - 使用功能指针方法进行状态机设计的三选二投票

linux - 如何在没有 usermod 的情况下将用户添加到组?

linux - sudoers NOPASSWD 在桌面启动器脚本中无效

c - Linux线程挂起/恢复

performance - 不同内核版本性能回归原因分析