Не удается заставить GDB остановиться на точке останова в Linux ядре, работающем под Qemu - PullRequest
0 голосов
/ 03 мая 2020

Скомпилировано ядро ​​linux 5.5.5, с make menuconfig добавлена ​​опция CONFIG_GDB_SCRIPTS и отключена опция CONFIG_DEBUG_INFO_REDUCED. Выполнено qemu

qemu-system-x86_64 \
    -kernel arch/x86/boot/bzImage \
    -append "root=/dev/sda1" \
    -device virtio-scsi-pci,id=scsi0 \
  -drive file=../../zso2020_cow.qcow2,if=none,id=drive0 \
  -device scsi-hd,bus=scsi0.0,drive=drive0 \
  -enable-kvm \
  -smp 1 \
  -net nic,model=virtio -net user \
  -net user,hostfwd=tcp::2222-:22 \
  -m 1G -balloon virtio \
  -fsdev local,id=hshare,path=$(pwd),security_model=none -device virtio-9p-pci,fsdev=hshare,mount_tag=hshare \
  -chardev stdio,id=cons,signal=off -device virtio-serial-pci -device virtconsole,chardev=cons \
  -soundhw hda \
  -usb -device usb-mouse \
  -gdb tcp::23308 \
  -display none \
  -S

Qemu работает с скомпилированным ядром, что я проверил, используя kprint в исходном коде. Затем я запустил

gdb \
    -ex "add-auto-load-safe-path $(pwd)" \
    -ex "file vmlinux" \
    -ex 'target remote localhost:23308' \
    -ex 'break start_kernel' \
    -ex 'continue'

(оба сценария были запущены из каталога с скомпилированным ядром)

Qemu переходит к входу пользователя в систему и выводит GDB (ожидает точку останова)

GNU gdb (Ubuntu 8.1-0ubuntu3.2) 8.1.0.20180409-git
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word".
Reading symbols from vmlinux...done.
Remote debugging using localhost:23308
0x000000000000fff0 in exception_stacks ()
Breakpoint 1 at 0xffffffff8271db30: file init/main.c, line 577.
Continuing.

Я также пытался

  • hbr, состоящий из br

  • сначала target remote :23308 i и установить точку останова, затем file vmlinux

  • go в скомпилированный каталог ядра и установить ядро ​​с уровня qemu

в каждом случае GDB не останавливается на точке останова.

Как правильно подключиться к ядру с помощью gdb, где искать ошибку?

1 Ответ

0 голосов
/ 12 мая 2020

Решением проблемы было добавление опции nokaslr и использование hbreak. Это означает заменить

-append "root=/dev/sda1"

на

`-append" root = / dev / sda1 nokaslr "

и

break start_kernel

с

hbreak start_kernel

, а затем gdb правильно перехватывает точки останова ядра.

...