qemu-discuss
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: breakpoints don't work for kernel debugging with qemu and gdb


From: ckim
Subject: RE: breakpoints don't work for kernel debugging with qemu and gdb
Date: Thu, 18 Feb 2021 21:20:39 +0900

Hi, Alex,

Thanks for the reply, I've just checked the breakpoint works for a simple 
bare-metal application.
I've tested with a minimal setup.s that just sets up stack pointer and calls 
c_entry() which prints "hello".
I can do stepi and can set breakpoint at c_entry and the breakpoint works.
So the problem seems to be when I run linux kernel on qemu. I tried breakpoints 
at start_kernel and dump_mem_init function that are in linux kernel source.

(gdb) hbreak start_kernel
Hardware assisted breakpoint 1 at 0xffff8000112a09ec: file init/main.c, line 
577.
(gdb) cont
Continuing. (doesn't stop)

BTW you showed me some options I don't understand so I'll check what they are.
Regards,

Chan Kim
> -----Original Message-----
> From: Alex Bennée <alex.bennee@linaro.org>
> Sent: Thursday, February 18, 2021 8:18 PM
> To: ckim@etri.re.kr
> Cc: qemu-discuss@nongnu.org
> Subject: Re: breakpoints don't work for kernel debugging with qemu and gdb
> 
> 
> ckim@etri.re.kr writes:
> 
> > Hello all,
> >
> >
> >
> > Thanks for the helps always..
> >
> > Today I wanted to debug/analyze linux kernel on qemu and ran qemu but
> > the breakpoints don't seem to work.
> >
> > When I type 'cont' it just goes with booting until it errors. (I
> > wanted to see what happens near the error location, not sure I'll be
> > able to figure it out though.. )
> >
> >
> >
> > The command I launched qemu was (just ignore the directories):
> >
> > ../build/aarch64-softmmu/qemu-system-aarch64 -M virt -cpu cortex-a72
> > -kernel ../../../LinuxDevDrv/linux-5.4.21/arch/arm64/boot/Image
> > -initrd ../../../LinuxDevDrv/linux-5.4.21/testinitrd/myinitrd.img
> > --append "root=/dev/ram init=/init" -m 2048M -nographic -s -S
> > -singlestep
> >
> >
> >
> > And the command I launched gdb-multiarch is
> >
> > gdb-multiarch ../../../LinuxDevDrv/linux-5.4.21/vmlinux -x gdbsetup
> >
> >
> >
> > file 'gdbsetup' contains
> >
> > set architecture aarch64
> >
> > set serial baud 115200
> >
> > target remote :1234
> >
> >
> >
> > I searched the internet and tried things.
> >
> > For kernel build, CONFIG_DEBUG_INFO, CONFIG_DEBUG_KERNEL,
> > CONFIG_MAGIC_SYSRQ, CONFIG_DEBUG_FS, CONFIG_HAVE_HW_BREAKPOINT,
> > CONFIG_HAVE_MIXED_BREAKPOINTS_REGS were all set to 'y',
> >
> > But CONFIG_MIXED_BREAKPOINTS_REGS was set to 'no. (just because I
> > couldn't find the option location. It's searched with
> > MIXED_BREAKPOINTS but I don't know the whereabout.). I also set
> CONFIG_KGDB to 'y'.
> >
> > I tried hbreak and softbreak(break). Gdb responds as if breakpoints
> > are well set. But when I type 'cont' the virtual machine just boots
> > without stopping at breakpoints.
> 
> Are you sure you've set breakpoints at places that will be hit?
> 
> Is your kernel using any form of address space randomisation?
> 
> AFAICT it all should be working (at least in the current HEAD):
> 
>   QEMU CMD: /home/alex/lsrc/qemu.git/builds/arm.all/qemu-system-aarch64 -
> monitor none -display none -chardev file,path=memory.out,id=output  -M
> virt -cpu max -display none -semihosting-config
> enable=on,target=native,chardev=output -kernel tests/tcg/aarch64-
> softmmu/memory -gdb unix:path=/tmp/tmpm5iiz3uvqemu-
> gdbstub/gdbstub.socket,server
>   GDB CMD: /home/alex/src/tools/binutils-
> gdb.git/builds/all/install/bin/gdb tests/tcg/aarch64-softmmu/memory -q -n
> -batch -ex 'set confirm off' -ex 'target remote /tmp/tmpm5iiz3uvqemu-
> gdbstub/gdbstub.socket' -x
> /home/alex/lsrc/qemu.git/tests/tcg/multiarch/gdbstub/memory.py
>   __start () at
> /home/alex/lsrc/qemu.git/tests/tcg/aarch64/system/boot.S:91
>   91              adr     x0, vector_table
>   ATTACHED: aarch64
>   Checking we can step the first few instructions
>   92              msr     vbar_el1, x0
>   95              adrp    x0, ttb
>   96              add     x0, x0, :lo12:ttb
>   PASS: single step in boot code
>   Setup catch-all for _exit
>   Breakpoint 1 at 0x4000386c: file
> /home/alex/lsrc/qemu.git/tests/tcg/aarch64/system/boot.S, line 201.
>   Breakpoint 2 at 0x4000228c: file
> /home/alex/lsrc/qemu.git/tests/tcg/multiarch/system/memory.c, line 456.
> 
>   Breakpoint 2, main () at
> /home/alex/lsrc/qemu.git/tests/tcg/multiarch/system/memory.c:456
>   456         bool ok = true;
>   PASS: break @ 0x4000228c <main+8> ({int (void)} 0x40002284 <main> 1 hits)
>   Hardware access (read/write) watchpoint 3: test_data[128]
> 
>   Hardware access (read/write) watchpoint 3: test_data[128]
> 
>   Old value = 0 '\000'
>   New value = 128 '\200'
>   init_test_data_u8 (unused_offset=0) at
> /home/alex/lsrc/qemu.git/tests/tcg/multiarch/system/memory.c:66
>   66              pdot(i);
>   PASS: awatch for test_data[128]
>   Hardware read watchpoint 4: test_data[128]
> 
>   Hardware read watchpoint 4: test_data[128]
> 
>   Value = 128 '\200'
>   0x00000000400016ac in read_test_data_u16 (offset=0) at
> /home/alex/lsrc/qemu.git/tests/tcg/multiarch/system/memory.c:186
>   186             word = *ptr++;
>   PASS: rwatch for test_data[128]
>   Hardware watchpoint 5: test_data[128]
> 
>   Hardware watchpoint 5: test_data[128]
> 
>   Old value = 128 '\200'
>   New value = 127 '\177'
>   init_test_data_u16 (offset=1) at
> /home/alex/lsrc/qemu.git/tests/tcg/multiarch/system/memory.c:125
>   125             pdot(i);
>   PASS: watch for test_data[128]
>   PASS: didn't reach backstop
>   [Inferior 1 (process 1) killed]
> 
> 
> >
> >
> >
> > Can anyone help me with this? Any advice will be appreciated.
> >
> > Thanks!
> >
> >
> >
> > Chan Kim
> >
> >
> 
> 
> --
> Alex Bennée







reply via email to

[Prev in Thread] Current Thread [Next in Thread]