qemu завершает работу при нажатии ctrl-c в gdb

Отладка моего собственного ядра с помощью qemu и gdb кажется излишне сложной, потому что нажатие ctrl-c в gdb для прерывания qemu не нарушает его, а заставляет его выйти с сообщением

qemu-system-x86_64: terminating on signal 2
[Inferior 1 (Remote target) exited normally]

Командная строка qemu:

qemu-system-x86_64 -s -no-shutdown -no-reboot -enable-kvm -m 1G -smp cores=1 -cpu qemu64 -drive if=pflash,format=raw,file=ovmf/OVMF.fd -drive file=fat:rw:hda,format=raw -net none -debugcon file:debug.log -global isa-debugcon.iobase=0x402 &

То же самое и без KVM. Может кто-нибудь помочь, как это решить?

  • qemu-система-x86_64 v3.1.0
  • gdb v8.2.1

Я бы не хотел создавать их последние версии из исходников, поскольку это кажется сложной задачей.

РЕДАКТИРОВАТЬ: Создана минимальная среда, в которой проблема может быть воспроизведена. Возможно, я отследил это до запуска всего этого из сценария оболочки, но, похоже, не могу продвинуться дальше. Комментирование вызова gdb в скрипте и запуск его с отдельного терминала решает проблему (однако мне нравятся вещи, которые работают с минимальным количеством нажатий клавиш). Вы можете скачать его здесь. Просто запустите скрипт под названием qd (есть ли лучший способ предоставить файлы? Я удалю его через некоторое время.)


person YaniMan    schedule 22.06.2020    source источник
comment
Предоставление минимального воспроизводимого примера, вероятно, увеличит шансы на получение ответа.   -  person Frant    schedule 22.06.2020
comment
Отредактировал вопрос, добавил пример. Спасибо за понимание.   -  person YaniMan    schedule 22.06.2020
comment
Вы пробовали собрать qemu с отладочными символами и отладить его?   -  person codegorilla    schedule 22.06.2020
comment
@YaniMan: Я тестировал QEMU 5.0.0 и GDB 9.2, та же проблема и то же решение, которое комментирует вызов GDB в скрипте и запускает его с отдельного терминала. Вероятно, вы могли бы просто изменить свой сценарий, чтобы QEMU запускался в другом терминале.   -  person Frant    schedule 22.06.2020
comment
@Frant: Оказалось, что это какая-то проблема со сценарием - хотя я не смог воспроизвести это с помощью небольшого сценария с помощью только xcalc &; sleep 1000. Запуск в другом терминале решил проблему. Если вы согласитесь, я приму ваше решение, если вы опубликуете его в качестве ответа.   -  person YaniMan    schedule 23.06.2020
comment
@YaniMan: спасибо за ваше предложение, цените его.   -  person Frant    schedule 23.06.2020


Ответы (1)


Я тестировал QEMU 5.0.0 и GDB 9.2, та же проблема и то же решение, которое комментирует вызов GDB в скрипте и запускает его с отдельного терминала. Вероятно, вы могли бы просто изменить свой сценарий, чтобы QEMU запускался в другом терминале. Запуск QEMU с использованием nohup тоже не работает.

Я включил сценарий, который обычно использую для создания свежих версий QEMU и GDB: в последних версиях, вероятно, есть исправленные ошибки. Скрипт работает в Ubuntu 20.04 и, вероятно, все еще работает в 16.04 и 18.04 - возможно, вам придется внести небольшие изменения в начало скрипта. Не стесняйтесь сообщать о проблемах, я буду рад их исправить.

build-qemu-gdb.sh:

#!/bin/bash

set -e 

# Xenial/16.04
PERL_MODULES_VERSION=5.22
SPHINX=python-sphinx

# Bionic/18.04
PERL_MODULES_VERSION=5.26
SPHINX=python-sphinx

# Focal/20.04
PERL_MODULES_VERSION=5.30
SPHINX="sphinx-doc sphinx-common"

# Qemu
QEMU_VERSION=5.0.0
PREFIX=/opt/qemu-${QEMU_VERSION}

# GDB
GDB_VERSION=9.2

do_get_gdb()
{
  if [ -f gdb-${GDB_VERSION}.tar.xz ]
  then
    echo "gdb-${GDB_VERSION}.tar.xz is present."
  else
    wget http://ftp.gnu.org/gnu/gdb/gdb-${GDB_VERSION}.tar.xz
  fi
}

do_get_qemu()
{
  if [ -f qemu-${QEMU_VERSION}.tar.xz ]
  then
    echo "qemu-${QEMU_VERSION}.tar.xz is present."
  else
    wget https://download.qemu.org/qemu-${QEMU_VERSION}.tar.xz
  fi
}

do_install_prerequisites()
{
  sudo apt-get install libglib2.0-dev libfdt-dev libpixman-1-dev zlib1g-dev libaio-dev libbluetooth-dev libbrlapi-dev libbz2-dev  libcap-dev libcap-ng-dev libcurl4-gnutls-dev libgtk-3-dev libibverbs-dev \
  libjpeg8-dev libncurses5-dev libnuma-dev librbd-dev librdmacm-dev libsasl2-dev libsdl2-dev libseccomp-dev libsnappy-dev libssh2-1-dev libvde-dev libvdeplug-dev libvte-2.91-dev libxen-dev liblzo2-dev \
  valgrind xfslibs-dev liblzma-dev flex bison texinfo gettext perl perl-modules-${PERL_MODULES_VERSION} ${SPHINX}
}

do_configure()
{
  local TARGET_LIST="x86_64-softmmu"
  pushd qemu-${QEMU_VERSION}
  ./configure --target-list="${TARGET_LIST}" --prefix=${PREFIX} --extra-cflags="-I$(pwd)/packages/include" --extra-ldflags="-L$(pwd)/packages/lib" 
  popd
}

do_extract_qemu()
{
  echo "extracting QEMU..."
  rm -rf qemu-${QEMU_VERSION}
  tar Jxf qemu-${QEMU_VERSION}.tar.xz
}

do_build_qemu()
{
  echo "building..."
  pushd qemu-${QEMU_VERSION}
  make all
  popd
}

do_install_qemu()
{
  echo "installing..."
  pushd qemu-${QEMU_VERSION}
  sudo make install
  popd
}

do_build_qemu()
{
  do_extract_qemu
  do_configure
  do_build_qemu
  do_install_qemu
}


do_extract_gdb()
{
  echo "extracting GDB..."
  rm -rf gdb-${GDB_VERSION}
  tar Jxf gdb-${GDB_VERSION}.tar.xz
}

do_build_gdb()
{
  do_extract_gdb
  rm -rf gdb
  mkdir gdb
  pushd gdb
  ../gdb-${GDB_VERSION}/configure --enable-tui --prefix=/opt/gdb-${GDB_VERSION}-x86_64-none-elf --target=x86_64-none-elf --program-prefix=x86_64-none-elf-
  make all install
  popd
}

# main
do_install_prerequisites

do_get_qemu
do_build_qemu

do_get_gdb
do_build_gdb

В результате новые пути для QEMU и GDB после установки будут:

/opt/qemu-5.0.0/bin/qemu-system-x86_64
/opt/gdb-9.2-x86_64-none-elf/bin/x86_64-none-elf-gdb
person Frant    schedule 22.06.2020