首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用QEMU和KGDB调试Linux内核?

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

Stack Overflow用户
提问于 2014-02-25 04:30:05
回答 2查看 5K关注 1票数 6

我已经能够启动一个基于powerpc的系统(MPC8544DS是特定的),使用以下方式调用qemu (v1.7.0)

代码语言:javascript
运行
复制
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闯入内核,如下所示:

代码语言:javascript
运行
复制
(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侵入内核,它会给我一个拒绝权限的错误:

代码语言:javascript
运行
复制
(gdb) set remotebaud 115200
(gdb) target remote /dev/ttyS0
permission denied 

是因为它被Qemu控制了吗?另外,在整个互联网上,kgdboc被设置为ttyAMA0,我理解它是AMBA总线的代表,它专门用于基于ARM的系统。对于PowerPC,我们有类似的东西吗?我在这里做错什么了吗?

EN

回答 2

Stack Overflow用户

发布于 2017-05-26 09:06:19

KGDB + QEMU一步一步

首先,QEMU的-gdb选项比KGDB的功能更强大,因此您可能需要使用它:然而,如何用GDB和QEMU调试Linux内核? QEMU是一种简单的方法,可以使用KGDB来为真正的硬件做准备。我已经在:Linux内核的实时调试,它是如何完成的,使用了哪些工具?上发布了一些Raspberry Pi KGDB指针

如果您想从头到尾快速入门,我在:https://github.com/cirosantilli/linux-kernel-module-cheat/tree/d424380fe62351358d21406280bc7588d795209c#kgdb中做了一个最小的全自动Buildroot示例

主要步骤是:

  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’目标远程本地主机:1234‘
  4. 在全球开发银行: (gdb) c 靴子应该会完成的。
  5. 在QEMU中: echo g>/proc/sysrq-触发器 GDB应该打破。
  6. 现在我们完成了,您可以像往常一样使用GDB: B sys_write c

在Ubuntu 14.04中测试。

ARM

不能让它工作。可能与:手臂上怎么用kgdb??有关

票数 7
EN

Stack Overflow用户

发布于 2014-08-06 15:59:27

您似乎混淆了来宾设备的主机串行设备/dev/ttyS0,以及客户内核中QEMU自己的用于KGDB的gdbserver。

通常,QEMU没有理由触摸主机的串行端口。这样做的唯一原因是,如果您希望拥有一个物理机器主机QEMU,并将其物理串行端口有效地分配给来宾,那么您就可以使用由实际串行电缆连接的不同的物理机器来调试来宾。

当您使用-s标志时,您告诉QEMU运行它自己的GDB服务器(默认情况下侦听主机环TCP端口1234),允许您侵入在客户上运行的任何程序,无论是内核、引导加载程序还是其他程序。这不同于让客户内核本身通过KGDB进行调试。

如果您想使用KGDB,就需要在内核构建中配置KGDB,以便使用模拟串口的客户端,然后告诉主机上的GDB使用模拟端口的主机端。QEMU命令行文档化详细介绍了这一点:

调试/专家选项: 默认设备是图形模式下的vc,非图形模式下的stdio。 此选项可多次用于模拟多达4个串口。

一个简短的列表,列出了一些更有趣的选项:

‘PTY’Linux只有伪TTY (一个新的PTY被自动分配) ‘/dev/XXX’Linux只使用主机tty,例如‘/dev/ttyS0’。主机串行口参数是根据仿真串口参数设置的。

这是你不想要的--除非你想用串行电缆来运行GDB的另一台物理机器。

‘TCP :主机:端口,服务器,无延迟’TCP网络控制台有两种操作模式。它可以将串行I/O发送到某个位置,也可以等待来自某个位置的连接。默认情况下,TCP网络控制台被发送到端口上的主机。如果使用服务器选项,除非指定了nowait选项,否则QEMU将在继续之前等待客户端套接字应用程序连接到端口。无延迟选项禁用Nagle缓冲算法。如果省略主机,则假定为0.0.0.0。一次只接受一个TCP连接。您可以使用telnet连接到相应的字符设备。 将tcp控制台发送到192.168.0.2端口4444 -serial tcp:192.168.0.2:4444的示例 在端口4444上侦听和等待连接-serial tcp::4444,服务器 -serial tcp: 192.168.0.100 :4444端口4444,服务器,nowait

这是一个很好的选择,也是一个共同的选择。您可以使用基本相同的GDB语法,例如,如果指定回送接口地址127.0.0.1和端口1234,则可以使用与前面完全相同的GDB命令。

‘unix :path,server’使用unix域套接字而不是tcp套接字。该选项的工作方式与您>已指定的-serial tcp相同,除非unix域套接字路径用于连接。

假设您的GDB支持它,这也是一个很好的选择。

您可能需要首先配置这些选项之一,在不使用KGDB的情况下运行,得到一个shell并计算出模拟设备的客户端被调用了什么,然后使用配置为使用该选项的KGDB重新启动。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22004616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档