1

I am newbie in Linux kernel and I'm trying to debug it with gdb via QEMU. My problem is gdb doesn't stop after break start_kernel. More details is below.

My host system is ArchLinux 5.0.10-arch1-1-ARCH x86_64.

Qemu is QEMU emulator version 4.0.0

gdb is GNU gdb (GDB) 8.2.1.

Debugged kernel is linux-4.20.12

I have done following steps:

  1. Compile kernel with
CONFIG_DEBUG_INFO=y CONFIG_DEBUG_KERNEL=y CONFIG_GDB_SCRIPTS=y # CONFIG_DEBUG_INFO_REDUCED is not set 
  1. Try to run LFS-8.4 system with it kernel via QEMU
qemu-system-x86_64 lfs-8.4-08052019.raw 

System starts good.

  1. Run this system with stop CPU and gdbserver options via QEMU
qemu-system-x86_64 lfs-8.4-08052019.raw -S -s 
  1. Start gdb
$ gdb 
  1. Load symbols
(gdb) file /mnt/lfs/sources/linux-4.20.12/vmlinux Reading symbols from /mnt/lfs/sources/linux-4.20.12/vmlinux...done. 
  1. Connect to QEMU
(gdb) target remote localhost:1234 Remote debugging using localhost:1234 0x000000000000fff0 in cpu_hw_events () 
  1. Set break point
(gdb) break start_kernel Breakpoint 1 at 0xffffffff82761ab5: file init/main.c, line 538. 

(I have tried hardware break point hbreak, but result is the same)

  1. Continue
(gdb) c Continuing. 

Further system loads login prompt without any breaks and gdb doesn't show any new messages. What I do wrong?

UPD: starting QEMU with embed -kernel facility give the same result

qemu-system-x86_64 -kernel /mnt/lfs/sources/linux-4.20.12/arch/x86/boot/bzImage -append 'root=/dev/sda3' -drive file=lfs-8.4-08052019.raw -S -s 

UPD2: I have tried to start QEMU without -S key and run target remote localhost:1234 in gdb immediately. QEMU have stopped loading at

Decompressing Linux... Parsing ELF... Performing relocations... done. Booting kernel. 

When I type s in gdb it says

(gdb) s Cannot find bounds of current function 

I suspect that debug symbols in vmlinux isn't related to bzImage. Maybe they was made wrong, but I don't how to make them another way.

UPD3: I have built kernel 2.6 in LFS-8.4 chroot environment. System isn't loaded, but kernel is successfully debugged by method described above! So, I think that it is problem of new kernels. Maybe I should switch off/on something in my 4.20.12 kernel, but I don't know what is exactly. For my purpose (reading Robert Love "Linux Kernel Development") kernel version 2.6 is enough.

1 Answer 1

2

You need to pass nokaslr to kernel cmdline.

qemu-system-x86_64 -kernel /mnt/lfs/sources/linux-4.20.12/arch/x86/boot/bzImage -append 'root=/dev/sda3 nokaslr' -drive file=lfs-8.4-08052019.raw -S -s

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.