在 2022/4/7 PM12:10, Shuai Xue 写道: > 在 2022/4/7 AM12:57, Richard Henderson 写道: >> On 4/6/22 09:30, Shuai Xue wrote: >>> Dear, folks, >>> >>> I try to debug Linux kernel with QEMU in single-stepping mode on aarch64 >>> platform, >>> the added breakpoint hits but after I type `step`, the gdb always jumps >>> into interrupt. >>> >>> My env: >>> >>> gdb-10.2 >>> qemu-6.2.0 >>> host kernel: 5.10.84 >>> VM kernel: 5.10.84 >>> >>> The steps to reproduce: >>> # host console: run a VM with only one core, the import arg: <qemu:arg >>> value='-s'/> >>> # details can be found here: >>> https://www.redhat.com/en/blog/debugging-kernel-qemulibvirt >>> virsh create dev_core0.xml >>> >>> # run gdb client >>> gdb ./vmlinux >>> >>> # gdb client on host console >>> (gdb) dir >>> ./usr/src/debug/kernel-5.10.84/linux-5.10.84-004.alpha.ali5000.alios7.aarch64 >>> (gdb) target remote localhost:1234 >>> (gdb) info b >>> Num Type Disp Enb Address What >>> 1 breakpoint keep y <MULTIPLE> >>> 1.1 y 0xffff800010361444 >>> mm/memory-failure.c:1318 >>> 1.2 y 0xffff800010361450 in memory_failure >>> at >>> mm/memory-failure.c:1488 >>> (gdb) c >>> Continuing. >>> >>> # console in VM, use madvise to inject a hwposion at virtual address >>> vaddr, >>> # which will hit the b inmemory_failur: madvise(vaddr, pagesize, >>> MADV_HWPOISON); >>> # and the VM pause >>> ./run_madvise.c >>> >>> # gdb client on host console >>> (gdb) >>> Continuing. >>> Breakpoint 1, 0xffff800010361444 in memory_failure () at >>> mm/memory-failure.c:1318 >>> 1318 res = -EHWPOISON; >>> (gdb) n >>> vectors () at arch/arm64/kernel/entry.S:552 >>> 552 kernel_ventry 1, irq // IRQ >>> EL1h >> >> The 'n' command is not a single-step: use stepi, which will suppress >> interrupts. >> Anyway, not a bug. >> >> r~ > > Hi, Richard, > > Thank you for your quick reply, I also try `stepi`, but it does NOT work > either. > > (gdb) c > Continuing. > > Breakpoint 1, memory_failure (pfn=1273982, flags=1) at > mm/memory-failure.c:1488 > 1488 { > (gdb) stepi > vectors () at arch/arm64/kernel/entry.S:552 > 552 kernel_ventry 1, irq // IRQ > EL1h > > According to QEMU doc[1]: the default single stepping behavior is step with > the IRQs > and timer service routines off. I checked the MASK bits used to control the > single > stepping IE on my machine as bellow: > > # gdb client on host (x86 plafrom) > (gdb) maintenance packet qqemu.sstepbits > sending: "qqemu.sstepbits" > received: "ENABLE=1,NOIRQ=2,NOTIMER=4" > > The sstep MASK looks as expected, but does not work as expected. > > I also try the same kernel and qemu version on X86 platform: >>> gdb-10.2 >>> qemu-6.2.0 >>> host kernel: 5.10.84 >>> VM kernel: 5.10.84 > > > The command `n` jumps to the next instruction. > > # gdb client on host (x86 plafrom) > (gdb) b memory-failure.c:1488 > Breakpoint 1, memory_failure (pfn=1128931, flags=1) at > mm/memory-failure.c:1488 > 1488 { > (gdb) n > 1497 if (!sysctl_memory_failure_recovery) > (gdb) stepi > 0xffffffff812efdbc 1497 if > (!sysctl_memory_failure_recovery) > (gdb) stepi > 0xffffffff812efdbe 1497 if > (!sysctl_memory_failure_recovery) > (gdb) n > 1500 p = pfn_to_online_page(pfn); > (gdb) l > 1496 > 1497 if (!sysctl_memory_failure_recovery) > 1498 panic("Memory failure on page %lx", pfn); > 1499 > 1500 p = pfn_to_online_page(pfn); > 1501 if (!p) { > > Best Regrades, > Shuai > > > [1] https://github.com/qemu/qemu/blob/master/docs/system/gdb.rst
Hi, Richard, I was wondering that do you have any comments to this? Best Regrades, Shuai