QEMU
qemu-system-i386 -hda boot.bin -s -S
-s代表开放tcp1234作为远程调试端口
-S代表不自动运行模拟(需要gdb连接之后进行操作)
GDB
target remote localhost:1234 //远程连接到1234端口
display/i $pc /每次断点都显示pc指向的指令
x/5uh 0x7c00 //显示某处的值,五个,u 16进制,h双字节
b *0x7c00 //在内存某处设置断点
info registers //显示寄存器值
si //下一条指令
display
info
x
x/<n/f/u>
n、f、u是可选的参数,表示一个内存地址
1) n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容
2) f 表示显示的格式
3) u 表示将多少个字节作为一个值取出来,如果不指定的话,GDB默认是4个bytes,如果不指定的话,默认是4个bytes。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。
参数 f 的可选值:
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。
参数 u 可以用下面的字符来代替:
b 表示单字节
h 表示双字节
w 表示四字 节
g 表示八字节
bochs
配置
- 使用硬盘引导
boot: disk #从硬盘启动
ata0-master: type=disk, path="hdboot.img", mode=flat
- 使用软盘引导
boot: floppy
floppya: type=1_44, 1_44="boot.img", status=inserted, write_protected=0
命令
- 设置断点,查看内存,步进 同gdb
- 每次断点显示寄存器
trace-reg on - 查看堆栈
print-stack
制作软盘硬盘
nasm boot.asm -o boot.bin
nasm loader.asm -o loader.bin
dd if=/dev/zero of=floppy.img bs=1440 count=1
sudo mkfs.vfat -F 12 floppy.img
dd if=boot.bin of=floppy.img bs=512 count=1 conv=notrunc
sudo mount floppy.img /media/ -t vfat -o loop
sudo cp loader.bin /media/
sync #缓存写入硬件
sudo umount /media/
本文详细介绍了如何使用QEMU模拟器与GDB调试器进行远程调试,包括设置断点、查看内存、步进执行及寄存器状态等关键调试技巧。同时,还提供了Bochs的配置方法和常见命令,以及创建软盘和硬盘映像的具体步骤。
4182

被折叠的 条评论
为什么被折叠?



