qemu使用快照来保存现场,以备后面debug

背景

在编写项目的时候需要用qemu来跑,大部分是正常的,但偶现一些bug,需要用gdb来调,但不能每次都用qemu跑,直到跑出来想要调的bug再调,费时费力。所以希望能有快照功能,在出现bug的时候直接保存现场,以后需要调的时候直接读取快照即可。

解决方案

使用qemu monitor的savevm功能保存快照,配合gdb进行调试。

使用qemu-img生成qcow2镜像

要想保存快照,读取快照,首先需要一个镜像来支持它们,这里使用qemu的qcow2镜像。
qemu-img create -f qcow2 test.qcow2 32M
test.qcow2为自己想要设置的镜像名字,后面可以加上希望的size,我这里设置的32M。
(平常出现的Error: No block device can accept snapshots问题就是没有镜像导致的)

qemu命令更新

在原有的qemu命令基础上,加上-drive if=none,format=qcow2,file=test.qcow2即可。

保存快照

出现bug或是希望保存快照的时候,ctrl+a c调出qemu monitor,使用savevm snapshot1即可保存快照,snapshot1为你希望保存的快照名称。
在qemu monitor中使用info snapshots可以查看当前所有快照信息。

读取快照

在加上-drive的qemu命令基础上,使用-loadvm snapshot1选项来加载快照。

继续完成工作

以我为例,加载完快照继续使用-s -S配合gdb调试即可。

### HiSilicon ARM64 架构下的 GDB 调试指南 #### 使用 QEMU 进行远程调试 为了在 HiSilicon ARM64 平台上进行有效的 GDB 调试,可以利用 QEMU 提供的模拟环境来设置远程调试会话。通过指定 `-s` 和 `-S` 参数可以让 QEMU 启动时暂停并等待 GDB 的连接。 ```bash qemu-system-aarch64 -machine virt -cpu cortex-a57 \ -machine type=virt -m 1024 -smp 4 \ -kernel arch/arm64/boot/Image \ -append "rdinit=/linuxrc root=/dev/vda rw console=ttyAMA0 loglevel=8" \ -s -S ``` 此时可以在宿主机上启动 GDB 客户端并与目标机建立连接[^2]: ```bash gdb-multiarch (gdb) target remote :1234 ``` #### 编译带调试信息的应用程序 对于基于 Node.js 或其他语言编写的应用,在编译阶段应加入相应的选项以保留完整的符号表和源码映射关系。例如针对 nodejs 应用可以通过 `pkg` 工具打包的同时保持 debug 符号不被剥离[^1]。 #### 设置断点与查看变量值 一旦成功连上了远端内核或应用进程,则可以根据实际需求设定断点、单步执行以及观察特定内存地址处的数据变化情况: ```c break main # 在main函数入口处设断点 continue # 继续运行直到遇到下一个断点 print variable_name # 输出某个局部/全局变量当前取值 info registers # 查看CPU寄存器状态 backtrace # 显示调用栈回溯信息 ``` #### 处理多线程场景中的并发问题 当面对复杂的多线程应用程序时,可能还需要额外关注各线程间的交互逻辑及其对应的上下文切换时机等问题。这时可借助于 GDB 内置命令如 `thread apply all bt` 来获取整个进程中所有活跃线程的状态快照
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值