在 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 时行为相同。有人可以帮忙吗,如何解决这个问题?
- qemu-system-x86_64 v3.1.0
- gdb v8.2.1
我不想从源代码构建这些的最新版本,因为这似乎是一项艰巨的任务。
编辑:创建了一个可以重现问题的最小环境。我可能已经从 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
用 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 时行为相同。有人可以帮忙吗,如何解决这个问题?
- qemu-system-x86_64 v3.1.0
- gdb v8.2.1
我不想从源代码构建这些的最新版本,因为这似乎是一项艰巨的任务。
编辑:创建了一个可以重现问题的最小环境。我可能已经从 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