2012-07-10 95 views
23

我是内核开发的新手,我想知道如何使用QEMU和gdb运行/调试Linux内核。我实际上阅读了罗伯特·洛夫的书,但不幸的是,它并没有帮助读者如何安装适当的工具来运行或调试内核......所以我所做的就是遵循本教程http://opensourceforu.efytimes.com/2011/02/kernel-development-debugging-using-eclipse/。我使用eclipse作为IDE在内核上开发,但我首先想让它在QEMU/gdb下运行。因此,我所做到目前为止是:如何使用GDB和QEMU调试Linux内核?

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的,我尝试使用以下命令:

gdb ./vmlinux 

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

所以我的问题是:我应该怎么做才能在Qemu上运行内核,将调试器附加到它上面,从而使它们一起工作,使内核开发更轻松。

回答

19

我想尝试:

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

使用“-s”选项使QEMU监听TCP端口1234 ::,您可以连接到为localhost:1234,如果你是在同一台机器上。 Qemu的'-S'选项会让Qemu停止执行,直到您执行continue命令。

最好的事情可能是看看一个体面的GDB教程,以配合你正在做的事情。 This one看起来相当不错。

+0

谢谢它的作品很多:)。我刚刚读完了这本书,内容涉及DDD,eclipse和gdb,不是由淀粉出版社出版的,但本书没有远程调试。我的内核现在正在启动,但似乎需要一些时间来加载(因为Qemu似乎只使用我的机器上的一个线程),现在被阻止在:? kernel_thread_helper +为0x0/0x10的。它是内核用来加载的方式吗?我的意思是,一旦它被加载,我们不应该有一个命令提示符吗?谢谢 – 2012-07-10 09:24:45

+0

它适合我。但是,我不知道如何在调用第一次继续之后强制停止断点。例如,我在start_kernel函数中放置了一个断点,但它永远不会停在那里。任何想法 ? – ARH 2013-03-17 04:35:03

2

当您尝试用gdb启动vmlinux的exe文件,在GDB那么第一件事就是发出CMDS:

(GDB)目标远程本地主机:1234

(GDB)破的start_kernel

(继续)

这将在start_kernel中破坏内核。

+0

我使用eclipse调试在qemu中运行的内核,并在start_kernel中设置了stop。但是它在eclipse启动调试后运行。我已经设置qemu在启动时停止,并且单独使用gdb是可以的。 – Ezio 2015-06-24 05:41:42

3

BjoernID的回答对我来说并不适用。第1持续后,没有达成任何断点和中断,便见线,如:

0x0000000000000000 in ??() 
(gdb) break rapl_pmu_init 
Breakpoint 1 at 0xffffffff816631e7 
(gdb) c 
Continuing. 
^CRemote 'g' packet reply is too long: 08793000000000002988d582000000002019[..] 

我想这已经是与不同的CPU模式(实模式在BIOS中对长模式时,Linux有引导)。总之,解决的办法是,而无需等待(不-S即)首先运行QEMU:

qemu-system-x86_64 -enable-kvm -kernel arch/x86/boot/bzImage -cpu SandyBridge -s 

就我而言,我需要在引导过程中的东西打破,所以一些十分之一秒后,我跑了GDB命令。如果你有更多的时间(例如,你需要调试一个手动加载的模块),那么时间并不重要。

gdb允许您指定启动时应运行的命令。这使自动化更容易一些。要连接到QEMU(应该现已开始),打破功能并继续执行,使用方法:

gdb -ex 'target remote localhost:1234' -ex 'break rapl_pmu_init' -ex c ./vmlinux 
13

步骤一步程序的Ubuntu 16.10主机

若要从头开始很快我在做了一个最小的全自动QEMU + Buildroot里面例如在测试:https://github.com/cirosantilli/linux-kernel-module-cheat/blob/c7bbc6029af7f4fab0a23a380d1607df0b2a3701/gdb-step-debugging.md主要步骤如下所述。

首先得到一个根文件系统rootfs.cpio.gz。如果你需要一个考虑:

然后在Linux内核:

git checkout v4.15 
make mrproper 
make x86_64_defconfig 
cat <<EOF >.config-fragment 
CONFIG_DEBUG_INFO=y 
CONFIG_DEBUG_KERNEL=y 
CONFIG_GDB_SCRIPTS=y 
EOF 
./scripts/kconfig/merge_config.sh .config .config-fragment 
make -j"$(nproc)" 
qemu-system-x86_64 -kernel arch/x86/boot/bzImage \ 
        -initrd rootfs.cpio.gz -S -s \ 
        -append nokaslr 

在另一个终端上,从Linux内核树内部,假设您要从start_kernel开始调试:

gdb \ 
    -ex "add-auto-load-safe-path $(pwd)" \ 
    -ex "file vmlinux" \ 
    -ex 'set arch i386:x86-64:intel' \ 
    -ex 'target remote localhost:1234' \ 
    -ex 'break start_kernel' \ 
    -ex 'continue' \ 
    -ex 'disconnect' \ 
    -ex 'set arch i386:x86-64' \ 
    -ex 'target remote localhost:1234' 

我们完成了!

内核模块的看到:How to debug Linux kernel modules with QEMU?

的Ubuntu 14.04,GDB 7.7.1,需要hbreakbreak软件断点被忽略了。在16.10中不再是这种情况。另请参见:https://bugs.launchpad.net/ubuntu/+source/qemu-kvm/+bug/901944

凌乱disconnect什么来后它是解决该错误:

Remote 'g' packet reply is too long: 000000000000000017d11000008ef4810120008000000000fdfb8b07000000000d352828000000004040010000000000903fe081ffffffff883fe081ffffffff00000000000e0000ffffffffffe0ffffffffffff07ffffffffffffffff9fffff17d11000008ef4810000000000800000fffffffff8ffffffffff0000ffffffff2ddbf481ffffffff4600000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007f0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000801f0000 

相关主题:

已知的限制:

参见: