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.如果您需要,请考虑:
init可执行映像:https://unix.stackexchange.com/questions/122717/custom-linux-distro-that-runs-just-one-program-nothing-else/238579#238579然后在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)
相关主题:
nokaslr:https://unix.stackexchange.com/questions/397939/turning-off-kaslr-to-debug-linux-kernel-using-qemu-and-gdb/421287#421287已知限制:
-O0:如何将Linux内核去优化并使用-O0进行编译?max-completions修复之后,GDB 7.11也会在某些类型的选项卡完成上中断你的内存:大型二进制文件的Tab完成中断可能是该补丁中未涉及的一些极端情况.所以ulimit -Sv 500000在调试之前是一个明智的行动.炸毁特别是当我完成标签file<tab>的filename的参数sys_execve,如:/sf/answers/2960341541/ 也可以看看:
| 归档时间: |
|
| 查看次数: |
42739 次 |
| 最近记录: |