学习目标
问题:
- 在用qemu + libvirtd中,是如何调试的?如何获取日志信息?如何将qemu的消息打印出来?
- 在qemu系统中,如何去调试?在libvirt中,又如何去调试追踪?
顺便贴下编译qemu的方法
sudo apt-get install -y libpixman-1-dev # 需要依赖 pixman
sudo apt-get install -y build-essential libepoxy-dev libdrm-dev libgbm-dev libx11-dev libvirglrenderer-dev libpulse-dev libsdl2-dev
sudo apt-get install -y libgusb-dev # libusb需要
# spice 安装 https://blog.csdn.net/clydezhou/article/details/7418782
# opengl mesa 安装
# 自己用的调试版本
git clone git://git.qemu.org/qemu.git
git checkout -b v4.0.0 v4.0.0
make clean
./configure --prefix= \
--enable-kvm \
--enable-trace-backends=log \
--disable-strip \
--enable-debug \
--enable-debug-info \
--enable-libusb \
--enable-usb-redir \
--enable-curl \
--enable-sdl \
--enable-opengl \
--enable-virglrenderer \
--enable-system \
--enable-modules \
--audio-drv-list=pa \
--enable-vhost-net \
--enable-vnc \
--target-list=x86_64-softmmu
root@inno-MS-7B89:qemu# /usr/local/bin/qemu-system-x86_64 --version
QEMU emulator version 4.0.0 (v4.0.0-dirty)
注:在编译qemu时最好把所有debug信息都打开
--enable-trace-backends=log \
--disable-strip \
--enable-debug \
--enable-debug-info \
qemu-mointor
相关参考:
如何使用mointor模式
使用qemu-system-xxx命令创建的虚拟机,可通过以下方式进入到mointor模式
ctrl+alt+1 虚拟机模式
ctrl+alt+2 qemu调试模式, 可通过 info xxx查看虚拟机状态
在libvirtd如何使用mointor
virsh qemu-monitor-command --hmp domain_name help # 查看支持命令
# 比如 domain_name=ubuntu18.04
# virsh qemu-monitor-command --hmp ubuntu18.04 info # 进入到mointor的info命令
注:
- qemu monitor protocol 简称qmp,是以json为格式的一种协议
- qmp和hmp的区别是qmp命令使用的是json格式,hmp直接使用命令
- qmp本质是一个本地的unix socket。qemu是server端,libvirt是client端
利用gdb调试qemu
注:这里不是使用gdb调试 qemu中的系统,而是用gdb来调试qemu
gdb --tui --args qemu-system-......
gdb --tui --args /opt/x86_64/qemu-x86-bin/bin/qemu-system-x86_64 -smp 2 -cpu host -enable-kvm -m 512M -kernel linux/arch/x86/boot/bzImage \
-hda ./x86_64.img -hdb ./Freeze.img -nographic \
-append "root=/dev/sda rw rootfstype=ext4 console=ttyS0 init=linuxrc loglevel=8"
qemu的打印
qemu的trace
相关参考
- 官方:tracing.txt
- Qemu Trace系统使用
- qemu trace debug
编译
qemu需要带trace功能,则configure中需要使能trace 后端系统--enable-trace-backends=log # 参考可选为 log / simple(默认值)
使用
# 添加你想要trace的event
$ cat /tmp/events
virtio_blk_req_complete
virtio_blk_handle_write
# 启动虚拟机带入trace参数
-trace events=/tmp/events,file=trace.bin
/tmp/events就是要跟踪的event,而trace.bin就是trace产生的文件,不能直接读,而要通过工具来读。
# 通过专业工具去解析 https://github.com/qemu/qemu/tree/master/scripts/tracetool
python3 simpletrace.py trace-events trace.bin