微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 qemu 和 gdb 调试内核,断点不起作用?

如何解决使用 qemu 和 gdb 调试内核,断点不起作用?

为了尝试使用 qemu 和 gdb(多好)为 aarch64 调试内核,我尝试了这个。

  • 使用 CONfig_DEBUG_INFO 构建内核

  • 使用“configure --target-list=aarch64-softmmu --enable-debug”以及“make”和“make install”构建 qemu。

  • 然后我跑了,
    qemu-system-aarch64 -machine virt -cpu cortex-a57 -machine type=virt -nographic -smp 1 -m 2048 -kernel arch/arm64/boot/Image -append "earlyprintk console=ttyAMA0 rootwait root=/dev/vda2" -drive if=none,file=/home/ckim/N1SDP/arm-reference-platforms/output/n1sdp/grub-ubuntu.img,id=disk1 -device virtio-blk-device,drive=disk1 -s -S

  • 并在另一个 shell 中运行,'gdb-multiarch vmlinux -x gdbcmd'。 gdbcmd 包含

    设置架构 aarch64 设置串行波特率 115200 目标远程:1234

如果没有 -S 选项,qemu 将继续引导 linux。 (以

开头
[    0.000000] Booting Linux on physical cpu 0x0000000000 [0x411fd070]
[    0.000000] Linux version 5.4.21 (ckim@chan-ubuntu) (gcc version 9.2.1 20191025 (GNU Toolchain for the A-profile Architecture 9.2-2019.12 (arm-9.10))) #6 SMP PREEMPT Fri Jan 22 11:43:52 JST 2021
[    0.000000] Machine model: linux,dummy-virt
[    0.000000] efi: Getting EFI parameters from FDT:
[    0.000000] efi: UEFI not found.
....

但是使用 -S,它会停止并等待调试器发出继续命令。
在调试器内部,我可以设置像 b start_kernel 这样的断点,然后它就会响应。但是,如果我输入“cont”,qemu 将开始引导,而不会在“start_kernel”处停止。我不知道这有什么问题。
而且我也不知道如何在不提供上面的磁盘映像的情况下启动。我如何使用 vanilla linux 内核运行它? (我使用过它,但使用上面的磁盘和磁盘映像,我在没有它们的情况下尝试过但它无法启动)。

请帮忙。

解决方法

在我发布问题后不久就解决了这个问题,我忘记回答了。

这是因为 KASLR(内核地址空间位置随机化)。您应该在内核配置中禁用它,或者在引导参数中提供选项。 (没有它,内核映像位于随机位置,导致调试符号位置和实际代码位置之间的不匹配)。对于 aarch64,这个 KASLR 默认是开启的。
就我而言,我是这样做的:

${QEMU_DIR}/qemu-system-aarch64 -M ${QMACHINE} -cpu cortex-a72 -kernel ${LINUX_DIR}/arch/arm64/boot/Image -initrd ${BUSYBOX_DIR}/initramfs.cpio.gz --append "root=/dev/ram init=/init nokaslr" -m 2048M -nographic

我不得不使用“hb”(或 hbreak(硬件中断))而不是“b”(或中断)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。