在 gdb 中按 ctrl-c 时 qemu 退出

qemu quits when pressing ctrl-c in gdb

用 qemu 和 gdb 调试我自己的内核似乎是不必要的困难,因为在 gdb 中按 ctrl-c 来破坏 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 时行为相同。有人可以帮忙吗,如何解决这个问题?

我不想从源代码构建这些的最新版本,因为这似乎是一项艰巨的任务。

编辑:创建了一个可以重现问题的最小环境。我可能已经从 shell 脚本中追踪到 运行 整个事情,但似乎无法进一步推进。注释掉脚本中的 gdb 调用并从一个单独的终端启动它,解决了这个问题(但是我喜欢使用尽可能少的击键的东西)。 你可以下载它here。 只需启动名为 qd 的脚本 (有没有更好的文件提供方式,过段时间我会删掉。)

我用 QEMU 5.0.0 和 GDB 9.2 进行了测试,同样的问题和同样的解决方案,即在脚本中注释掉 GDB 调用并从单独的终端启动它。你可能只修改你的脚本,这样 QEMU 就会在另一个中启动 终端。使用 nohup 启动 QEMU 也不起作用。

我包含了我通常用于构建 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