为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕标琳琳 2019-10-08 15:36:43
我是内核开发的新手,我想知道如何使用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 -j42)编译结束后,我使用以下命令运行Qemu:qemu-system-x86_64 -s -S /dev/zero -kernel /arch/x86/boot/bzImage它以“停止”状态启动内核3)因此,我必须使用gdb,请尝试以下命令:gdb ./vmlinux哪个可以正确运行,但是...现在我不知道该怎么做...我知道我必须在端口1234(Qemu使用的默认端口)上使用远程调试,并使用vmlinux作为符号表文件调试。所以我的问题是:我应该怎么做才能在Qemu上运行内核,将调试器附加到内核上,从而使它们协同工作,从而使内核开发变得更加轻松。
查看完整描述

3 回答

?
九州编程

TA贡献1785条经验 获得超4个赞

我会尝试:


(gdb) target remote localhost:1234

(gdb) continue

使用'-s'选项可使qemu侦听端口tcp :: 1234,如果您在同一台计算机上,则可以将其作为localhost:1234连接。Qemu的“ -S”选项使Qemu停止执行,直到您发出Continue命令为止。


最好的办法是看一本不错的GDB教程,以了解您的工作。这个看起来不错。


查看完整回答
反对 回复 2019-10-08
?
波斯汪

TA贡献1811条经验 获得超4个赞

BjoernID的答案对我而言并不是很有效。在第一次继续之后,没有断点到达,并且在中断时,我会看到诸如以下的行:


0x0000000000000000 in ?? ()

(gdb) break rapl_pmu_init

Breakpoint 1 at 0xffffffff816631e7

(gdb) c

Continuing.

^CRemote 'g' packet reply is too long: 08793000000000002988d582000000002019[..]

我猜想这与不同的CPU模式有关(BIOS引导时是BIOS的实模式,而Linux是引导时的长模式)。无论如何,解决方案是先运行QEMU而不等待(即,不使用-S):


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


查看完整回答
反对 回复 2019-10-08
  • 3 回答
  • 0 关注
  • 1176 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信