bochs一般用法
bochs是一个开源x86虚拟机软件。在他的实现中定义了各种数据结构来模拟硬件,用软件模拟硬件速度慢。
bochs的硬件调试体现在:
1)可以查看页表、gdt、idt等数据结构
2)可以查看栈中数据
3)可以反汇编任意内存
4)实模式、保护模式互相变换时提醒
5)中断发生时提醒
bochs中x和xp命令都是用来查看内存的,它们两个的区别在于x命令用于查看线性地址,而xp用来查看物理地址。之前的章节介绍过在实模式下只有物理地址,保护模式才有线性地址的概念。所以实模式下只能用xp命令。
注意bochs里的"字"是4字节。
表示大小的单位:
b 一个字节
h 半个字,2个字节
w 一个字,4个字节
g 双字,8个字节
用xp和x命令查看的内容是以“显示单元”为单位,不是以字节为单位。所以如果不指定数据大小,默认以4字节为单位。
bochs中各进制写法也不同
八进制:011(以0开头)
十进制:11
十六进制:0x11(只支持0x开头)
xp命令用法xp /nuf<addr>
,nuf是一个数字序列,每个字母都有对应含义。
n用来指定要显示的单元数。
u指显示单元大小。最终要显示几个字节,是n*u来决定的
f是指用哪种进制显示。
以下是没有被BIOS加载MBR前的内存查看情况,分别用不同显示方式展示。
查看下BIOS程序。可以看到cs:ip,这是BIOS程序的入口地址
u反汇编指令,可以将二进制数据反汇编成汇编指令。
由此可以发现BIOS在该位置进行了一次远转移指令。
Debugger control类指令
q|quit|exit,左边任意一个都能退出调试状态,关闭虚拟机
set指令族,用于设置寄存器比较常用
1)例如set reg=val。可以色湖之的寄存器包括通用寄存器和段寄存器
2)也可以设置每次停止执行时,是否反汇编指令:set u on|off
show指令族
1.show mode
每次CPU变换模式的时候就进行提示,实模式、保护模式的切换等。
2.show int
每次有中断的时候就提示,同时显示3中中断类型,softint、extint和iret。可以单独显示某种类中断,如执行show siftint只显示软中断,show extint只显示来自外部设备中断,show iret只显示iretd指令有关信息的中断。
3.show call
每次有函数调用的时候就提示。
trace on|off如果设置为on,每执行一条指令,bochs就会将反汇编的代码打印到控制台
Execution control类指令
c|cont|continue,左边列出指令都代表向下执行,若没有断点就会一直执行下去。
s|step [count]执行count条指令,count是指单步步入执行的指令数,若不指定默认为1,遇到call会进入call执行
p|n|next单步步过指令,遇到call会把整个call当作1条指令执行。
Breakpoint management类指令
vb|vbreak [seg:off]以虚拟地址添加断点,程序执行到虚拟地址时停下来,注意虚拟地址时段内偏移的形式。
lb|lbreak[addr]以线性地址添加断点,程序执行到此线性地址时停下来。
pb|pbreak|b|break [addr]以物理地址添加断点。程序执行到此物理地址时停下来。b比较常用。
sb[delta] delta表示增量,意为再执行delta指令程序就中断。
sba[time]CPU从运行开始,执行第tim条指令中断,从0开始的指令数。
以读些IO打断点:
watch也有子命令,常用为以下两个
watch r|read [phy_addr]设置读断点,如果物理地址phy_addr有读操作则停止运行。
watch w|write [phy_addr]设置写断点,如果物理地址phy_addr有写操作则停止运行。此命令非常有用如果某块地址内存不知何时被改写了,可以设置此中断。
watch 显示所有读写断电
unwatch 清除所有断点
unwatch [phy_addr] 清除在此地址上的读些断点
blist 显示所有断点信息,功能等同于info b
bpd|bpe [n] 禁用断点/启用断点,n是断点号,可以用blist指令先查出来。
d|del|delete [n]删除某断点。
CPU and memory contents类指令
x /nuf [line_addr]显示线性地址的内容。n、u、f三个参数都可选,如果没有指定,n为1,是4个字节,f是16进制。
n显示的单元数
u每个单元数大小,u可以是下列之一:
1)b 1字节
2)h 2字节
3)w 4字节
4)g 8字节
f显示格式,f可以是下列之一:
1)x十六进制
2)d十进制
3)u无符号
4)o八进制
5)t二进制
6)c字符显示
7)s按照ASCIIz显示
8)i按照instr显示
xp /nuf [phy_addr]与x指令参数相同,用于显示物理地址。
setpmem [phy_addr] [size] [val]设置以物理地址phy_addr开始,连续size个字节的内容为val。
size最多只能设置4个字节宽度的数据。
r|reg|regs|registers 任意四个命令之一可以显示8个通用寄存器的指+eflag寄存器+eip寄存器
ptime显示Bochs启动之后,总执行指令数。
printf-stack [num]显示堆栈,num默认为16,表示打印栈的条目数。输出内容是栈顶在上,低地址在上,高地址在下。
?|calc 内置计算器
info是个指令族,执行help info时可以查看其所有支持的子命令,如下:
info pb|pbreak|b|break
info CPU 显示CPU所有寄存器的值
info fpu显示FPU状态
info idt显示中断向量表
info gdt[num] 显示全局描述表GDT,如果加了num,只显示gdt中的num项描述符。
info ldt显示全局描述符表LDT。
info tss 显示任务状态段TSS
info ivt [num] 显示中断向量表IVT。和gdt一样,如果制定了num,则只会显示第num项的中断向量。
info flags|eflags 显示状态寄存器,r也可以做到
sreg 显示所有段寄存器的值。
creg 显示所有控制寄存器的值。
info tab 显示页表中线性地址到物理地址的映射。
page line_addr 显示线性地址到独立地址简单映射。
来源:CSDN
作者:时光菜刀
链接:https://blog.csdn.net/AlexSmoker/article/details/104107438