首页 > 解决方案 > 调试Android内核时的下一步错误

问题描述

我正在研究 Android 上的 Linux 内核源代码。于是我在Android模拟器(基于qemu的模拟器)上搭建了一个调试环境。但是,当我使用 gdb 调试内核时,下一个命令总是跳转到错误代码。这是示例:

(gdb) b vfs_write
Breakpoint 3 at 0xffffffff80383ec8: file fs/read_write.c, line 527.
(gdb) c
Continuing.
[Switching to Thread 3]

Thread 3 hit Breakpoint 3, vfs_write (file=0xffff88003aa7a600, buf=0x72f8f6490f9f "*\032_\f\220\250\364\275\345\310\023\320\022", count=1, pos=0xffff88000b7c7f18)
at fs/read_write.c:527
527     if (!(file->f_mode & FMODE_WRITE))
(gdb) list
522 
523 ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_t *pos)
524 {
525     ssize_t ret;
526 
527     if (!(file->f_mode & FMODE_WRITE))
528         return -EBADF;
529     if (!(file->f_mode & FMODE_CAN_WRITE))
530         return -EINVAL;
531     if (unlikely(!access_ok(VERIFY_READ, buf, count)))
(gdb) n
ioread8 (addr=0xffffc90000040000) at lib/iomap.c:73
73      IO_COND(addr, return inb(port), return readb(addr));
(gdb) 

fs/read_write.c:527 处的断点。在下一个 (n) 时,调试器应在 fs/read_write.c:528 或 fs/read_write.c:529 处停止。但出乎意料的是,它跳到了 lib/iomap.c:73。

为什么会出现这个问题?

我从

https://android.googlesource.com/kernel/goldfish

而且,我结帐分支 android-goldfish-4.4-dev

我用一些配置构建了内核:

我像这样启动了模拟器:

emulator -avd Pixel2XL-x86_64 -show-kernel -verbose -wipe-data -netfast -kernel arch/x86/boot/bzImage  -qemu -s

avd Pixel2XL-x86_64 是 x86_64 架构,我将内核构建为 x86_64。

有人说这是GCC O2优化造成的。我参考了内核黑客:GCC优化以获得更好的调试体验(-Og)

但是,没用。

标签: androidlinux-kernelgdbqemukgdb

解决方案


推荐阅读