我正在研究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。
为什么会出现此问题?
我从Android内核中获取
https://android.googlesource.com/kernel/goldfish
然后,我结帐android-goldfish-4.4-dev
我用一些配置构建了内核:
CONFIG_DEBUG_KERNEL=y
CONFIG_DEBUG_INFO=y
CONFIG_KGDB=y
CONFIG_FRAME_POINTER=y
\# CONFIG_DEBUG_RODATA
未设置\# CONFIG_RANDOMIZE_BASE
未设置我这样启动模拟器:
emulator -avd Pixel2XL-x86_64 -show-kernel -verbose -wipe-data -netfast -kernel arch/x86/boot/bzImage -qemu -s
avd Pixel2XL-x86_64是x86_64 arch,我将内核构建为x86_64。
有人说这是由GCC O2优化引起的。我引用了kernel hacking: GCC optimization for better debug experience (-Og)
但是,这没用。