Ubuntu kernel debugolás GDB-vel és QEMU-val

Fórumok

Sziasztok!

Eddig alapvetően úgy debugoltam linuxot, hogy QEMU-nak megadtam a helyileg fordított kernelt + valami Ubuntu cloud image-t majd a QEMU által létrehozott remote targetre rácsatlakoztam GDB-vel. Ez működik, kis hátránya, hogy le kell szednem a kódot, fordítanom kell egy kernelt, aminek a headerjeit isntallálni kell a virtuális gépen belül, meg modulokat sem találja, így azokat is.

Most pár dolog bekerült Ubuntu 19.10-be alapból, így igazából a cloud imageben lévő kernel meg header fájlok teljesen jók. Addig jutottam, hogy letöltöttem a dbgsym kernelt a virtuális gépben és a vmlinuz-dbgsym fájlt rámentettem a host gépre és megadtam azt a GDB-nek, hogy keressen benne szimbólumokat. Sajnos nem nagyon működik a dolog: szimbólumokat talál, de breakpointok nem működnek, meg az addressek sem matchelnek (neveket nem tudja feloldani).

Tudna valaki segíteni, mi lehet a baj? Kernel-t most nem adok meg a QEMU-nak, csak simán elindítom a cloud image-t megadva mint rootfs, ez lehet a baj? Köszönöm előre is a segítséget.

Hozzászólások

Sikerült megoldani. A gond a cloud-image volt. Hogy sikeresen mapelődjenek a szimbólumok címei, le kell tiltani a címtér randomizációt (nokasler és nokaiser kernel command line argumentumok). Viszont a /etc/default/grub fájlban hiába írtam bele GRUB_CMDLINE_LINUX_DEFAULT változóba ezeket, majd nyomtam sudo update-grub parancsot, nem kezdett velük semmit.

A helyes eljárás cloud-image esetben:
/etc/default/grub.d/50-cloudimg-settings.cfg fájlban lévő GRUB_CMDLINE_LINUX_DEFAULT-jába beírni így:
GRUB_CMDLINE_LINUX_DEFAULT="console=tty1 console=ttyS0 nokaiser nokaslr" (console= változók alapból benne voltak)
majd:
sudo update-grub
reboot

Ez után a GDB látja a címeket, pl:
(gdb) where
#0 0xffffffffb349cdbe in ?? ()
#1 0xffffffffb349c9f0 in ?? ()
#2 0x0000000000000000 in ?? ()

helyett valami ilyesmi látszik:
gdb) where
#0 0xffffffff81a9cdbe in native_safe_halt () at /build/linux-IewOGS/linux-5.3.0/arch/x86/include/asm/irqflags.h:60
#1 0xffffffff81a9c9f0 in arch_safe_halt () at /build/linux-IewOGS/linux-5.3.0/arch/x86/include/asm/paravirt.h:156
#2 default_idle () at /build/linux-IewOGS/linux-5.3.0/arch/x86/kernel/process.c:580
#3 0xffffffff8103d525 in arch_cpu_idle () at /build/linux-IewOGS/linux-5.3.0/arch/x86/kernel/process.c:571
...