我是内核开发新手,我想知道如何使用QEMU和gdb运行/调试linux内核.我正在读罗伯特·洛夫的书,但不幸的是,这本书并不能帮助读者安装合适的工具来运行或调试内核...所以我所做的就是遵循这个教程.我使用eclipse作为IDE在内核上开发,但我想首先让它在QEMU/gdb下工作.到目前为止,我所做的是:

1) 要编译内核,请执行以下操作:

make defconfig (then setting the CONFIG_DEBUG_INFO=y in the .config)
make -j4

2) 编译完成后,我使用以下命令运行Qemu:

qemu-system-x86_64 -s -S /dev/zero -kernel /arch/x86/boot/bzImage

在"停止"状态下启动内核

3) 因此,我必须使用gdb,我try 以下命令:

gdb ./vmlinux

正确运行,但是...现在我不知道该怎么办...我知道我必须在端口1234(Qemu使用的默认端口)上使用远程调试,使用vmlinux作为调试的符号表文件.

所以我的问题是:我应该怎么做才能在Qemu上运行内核,将我的调试器连接到它,从而让它们一起工作,让我的内核开发变得更容易.

推荐答案

我会try :

(gdb) target remote localhost:1234
(gdb) continue

使用"-s"选项可以让qemu在端口tcp::1234上侦听,如果您在同一台机器上,您可以通过localhost:1234连接到该端口.Qemu的'-s'选项使Qemu停止执行,直到您发出continue命令.

最好的办法可能是看看一本像样的GDB教程,以便了解您正在做的事情.This one看起来很不错.

Linux相关问答推荐

将参数#0更改为shell脚本不工作

如何根据具体情况打印两行输出?

如何创建一堆文件中所有单词的列表?

通过 ssh 在远程计算机上按索引访问数组元素

使用 PowerShell 删除重复行所需的时间比 WSL 长得多

在具有不同文件类型的文件夹中编辑多个 xml 文件 - 使用预定顺序

在 bash 中获取目录或文件的基本名称的快速且正确的方法

`G++ 4.9.4` 中关于 WEXITSTATUS 的奇怪行为

应用程序如何在运行时解析为不同版本的共享库?

从 Linux 到 Windows 交叉编译 C++ 应用程序的手册?

哪个程序在给定任何文件的情况下创建一个 C 数组?

对一行的最后一个字段进行排序

谁决定任何数据类型或 struct 的大小(取决于 32 位或 64 位)?

根据日期范围过滤日志(log)文件条目

Linux AMD64 中如何使用 fs/gs 寄存器?

什么是适用于 Linux 的好的 Prolog IDE?

命令行 Arduino 编译和上传?

cmake : 从脚本设置环境变量

在文件夹中的 gzip 文件中查找字符串

获取本地时区的 Olson TZ 名称?