如何使用GDB和QEMU调试Linux内核?

E-K*_*ami 33 linux gdb qemu linux-kernel

我是内核开发的新手,我想知道如何使用QEMU和gdb运行/调试linux内核.我实际上正在阅读Robert Love的书,但遗憾的是它无法帮助读者如何安装适当的工具来运行或调试内核......所以我所做的就是按照本教程http://opensourceforu.efytimes.com/2011/02/kernel-development-debugging-using-eclipse /.我正在使用eclipse作为IDE在内核上开发,但我想首先让它在QEMU/gdb下运行.所以我到目前为止所做的是:

1)用以下代码编译内核:

make defconfig (then setting the CONFIG_DEBUG_INFO=y in the .config)
make -j4
Run Code Online (Sandbox Code Playgroud)

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

qemu-system-x86_64 -s -S /dev/zero -kernel /arch/x86/boot/bzImage
Run Code Online (Sandbox Code Playgroud)

它以"停止"状态启动内核

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

gdb ./vmlinux
Run Code Online (Sandbox Code Playgroud)

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

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

Bjo*_*rnD 29

我试试:

(gdb) target remote localhost:1234
(gdb) continue
Run Code Online (Sandbox Code Playgroud)

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

最好的办法可能是看看一个体面的GDB教程,以便与你正在做的事情相处.这个看起来很不错.


Cir*_*四事件 22

在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
Run Code Online (Sandbox Code Playgroud)

在另一个终端上,从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'
Run Code Online (Sandbox Code Playgroud)

我们完成了!!

对于内核模块,请参阅:如何使用QEMU调试Linux内核模块?

对于Ubuntu 14.04,hbreak需要GDB 7.7.1 ,break软件断点被忽略.16.10不再是这种情况了.另见:https://bugs.launchpad.net/ubuntu/+source/qemu-kvm/+bug/901944

混乱disconnect以及之后发生的事情是解决错误:

Remote 'g' packet reply is too long: 000000000000000017d11000008ef4810120008000000000fdfb8b07000000000d352828000000004040010000000000903fe081ffffffff883fe081ffffffff00000000000e0000ffffffffffe0ffffffffffff07ffffffffffffffff9fffff17d11000008ef4810000000000800000fffffffff8ffffffffff0000ffffffff2ddbf481ffffffff4600000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007f0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000801f0000
Run Code Online (Sandbox Code Playgroud)

相关主题:

已知限制:

也可以看看: