注意:调试版的bochs必须在编译的时候加: --enable-debugger
to the configure line in .conf.win32-vcppsass
bochs调试FAQ:函数
1. Q:如何从引导扇区开始设置断点?ui
A: BIOS被载入内存中运行,其引导扇区的地址通常都是在0x7c00,由于在实模式下,逻辑地址和物理地址是一一对应的, 因此咱们能够在启动bochs调试的命令行下输入spa
pb 0x7c00 或者 vb 0:0x7c00.net
就着输入命令行
cdebug
bochs就会在0x7c00处停下 调试
2. Q: 我想在单步执行(s)后看到寄存器的变化状况, 该怎么设置?code
A: 输入blog
trace-reg on
后, 再执行单步调试的时候都会显示寄存器的当前状态了.
3. Q: 在单步调试的时候,遇到一个调用子程序的指令,输入s会把调试跳进子程序中,如何只执行子程序而不要陷进去调试?
A: 在调试子程序的指令处,不用s改成n或p
4. Q: 查看当前堆栈的命令?
A: print-stack
Table 1. 部分Bochs调试指令
行为 |
指令 |
举例 |
在某物理地址设置断点 |
b addr |
b 0x30400 |
显示当前全部断点信息 |
info break |
info break |
继续执行,直到赶上断点 |
c |
c |
单步执行 |
s |
s |
单步执行(遇到函数则跳过) |
n |
n |
查看寄存器信息 |
info cpu r fp sreg creg |
info cpu r fp sreg creg |
查看堆栈 |
print-stack |
print-stack |
查看内存物理地址内容 |
xp /nuf addr |
xp /40bx 0x9013e |
查看线性地址内容 |
x /nuf addr |
x /40bx 0x13e |
反汇编一段内存 |
u start end |
u 0x30400 0x3040D |
反汇编执行的每一条指令 |
trace-on |
trace-on |
每执行一条指令就打印CPU信息 |
trace-reg |
trace-reg on |
其中"xp /40bx 0x9013e"这样的格式可能显得有点复杂,读者能够用"help x"这一指令在Bochs中亲自看一下它表明的意义
c|cont 向下执行,至关于WinDBG的“g”。
s|step|stepi [count] 单步执行,至关于WinDBG的“t”,count 默认为 1。
p|n|next 单步执行,相似于WinDBG的“p”。
q|quit|exit 退出调试,同时关闭虚拟机。
Ctrl-C 结束执行状态,返回调试器提示符。
Ctrl-D if at empty line on command line, exit
(至少在Windows版本中我没有发现Ctrl-D有什么功能)
vb|vbreak [seg:off] 在虚拟地址上下断点。
lb|lbreak [addr] 在线性地址上下断点,至关于WinDBG的“bp”。
pb|pbreak|b|break [addr] 在物理地址上下断点。(为了兼容GDB的语法,地址前能够加上一个“*”)。
blist 显示断点状态,至关于WinDBG的“bl”。
bpd|bpe [num] 禁用/启用断点,WinDBG的“be”和“bd”。num是断点号,能够用blist命令查询。
d|del|delete [num] 删除断点,至关于WinDBG的“bc”。mum是断点号,可
以用blist命令查询。
watch read [addr] 设置读断点。
watch write [addr] 设置写断点。
unwatch read [addr] 清除读断点。
unwatch write [addr] 清除写断点。
watch 显示当前全部读写断点。
unwatch 清除当前全部读写断点。
watch stop|continue 开关选项,设置遇到读写断点时中断下来仍是显示出来但
是继续运行。
x /nuf [addr] 显示线性地址的内容
xp /nuf [addr] 显示物理地址的内容
n 显示的单元数
u 每一个显示单元的大小,u能够是下列之一:
b BYTE
h WORD
w DWORD
g DWORD64
注意: 这种命名法是按照GDB习惯的,而并非按照inter的规范。
f 显示格式,f能够是下列之一:
x 按照十六进制显示
d 十进制显示
u 按照无符号十进制显示
o 按照八进制显示
t 按照二进制显示
c 按照字符显示
n、f、u是可选参数,若是不指定,则u默认是w,f默认是x。若是前面使用过x或
者xp命令,会按照上一次的x或者xp命令所使用的值。n默认为1。addr 也是一个
可选参数,若是不指定,addr是0,如过前面使用过x或者xp命令,指定了n=i,
则再次执行时n默认为i+1。
setpmem [addr] [size] [val] 设置物理内存某地址的内容。
须要注意的是,每次最多只能设置一个DWORD:
这样是能够的:
<bochs:1> setpmem 0x00000000 0x4 0x11223344
<bochs:2> x /4 0x00000000
[bochs]:
0x00000000 <bogus+ 0>: 0x11223344 0x00000000 0x00000000 0x00000000
这样也能够:
<bochs:1> setpmem 0x00000000 0x2 0x11223344
<bochs:2> x /4 0x00000000
[bochs]:
0x00000000 <bogus+ 0>: 0x00003344 0x00000000 0x00000000 0x00000000
或者:
<bochs:1> setpmem 0x00000000 0x1 0x20
<bochs:2> x /4 0x00000000
[bochs]:
0x00000000 <bogus+ 0>: 0x00000020 0x00000000 0x00000000 0x00000000
下面的作法都会致使出错:
<bochs:1> setpmem 0x00000000 0x3 0x112233
Error: setpmem: bad length value = 3
<bochs:2> setpmem 0x00000000 0x8 0x11223344
Error: setpmem: bad length value = 8
crc [start] [end] 显示物理地址start到end之间数据的CRC。
set $reg = val 设置寄存器的值。如今版本能够设置的寄存器包括:
eax ecx edx ebx esp ebp esi edi
暂时不能设置:
eflags cs ss ds es fs gs
r|reg|registers reg = val 同上。
dump_cpu 显示完整的CPU信息。
set_cpu 设置CPU状态,这里能够设置dump_cpu所能显示出来的全部CPU状态。
u|disas|disassemble [/num] [start] [end]
反汇编物理地址start到end 之间的代码,如
果不指定参数则反汇编当前EIP指向的代码。
num是可选参数,指定处理的代码量。
set $disassemble_size = 0|16|32 $disassemble_size变量指定反汇编使用的段
大小。
set $auto_disassemble = 0|1 $auto_disassemble决定每次执行中断下来的
时候(例如遇到断点、Ctrl-C等)是否反汇
编当前指令。
trace-on|trace-off Tracing开关打开后,每执行一条指令都会将反汇编的结果
显示出来。
ptime 显示Bochs自本次运行以来执行的指令条数。
sb [val] 再执行val条指令就中断。val是64-bit整数,以L结尾,形如“1000L”
sba [val] 执行到Bochs自本次运行以来的第val条指令就中断。val是64-bit整数,以L结尾,形如“1000L”
modebp 设置切换到v86模式时中断。
record ["filename"] 将输入的调试指令记录到文件中。文件名必须包含引号。
playback ["filename"] 回放record的记录文件。文件名必须包含引号。
print-stack [num] 显示堆栈,num默认为16,表示打印的条数。
?|calc 和WinDBG的“?”命令相似,计算表达式的值。
load-symbols [global] filename [offset]
载入符号文件。若是设定了“global”关键字,则符号针对全部上下文都有效。offset会默认加到全部的symbol地址上。symbol文件的格式为:"%x %s"。
info program 显示程序执行的状况。
info registers|reg|r 显示寄存器的信息。
info pb|pbreak|b|break 至关于blist
info dirty 显示脏页的页地址。
info cpu 显示全部CPU寄存器的值。
info fpu 显示全部FPU寄存器的值。
info idt 显示IDT。
info gdt [num] 显示GDT。
info ldt 显示LDT。
info tss 显示TSS。
info pic 显示PIC。
info ivt [num] [num] 显示IVT。
info flags 显示状态寄存器。
info cr 显示CR系列寄存器。
info symbols 显示symbol信息。
info ne2k|ne2000 显示虚拟的ne2k网卡信息。
Bochs经常使用调试命令
Bochs是很是好用的模拟器,命令也不少,不过最经常使用的其实总结起来也就包括几条,记住这些命令基本均可以知足调试需求了。
1. 断点操做
(1)设置断点:b 物理地址
例:b 0x7c00 在物理地址0x7c00处设置断点
(2)查询目前已经设置过的断点:info break
2. 程序的执行
(1)执行程序,直到遇到断点: c
(2)单步执行:s
(3)执行N条指令:step N
例如执行3条指令: step 3
2. 寄存器值查询
(1)info r 这条指令会查询基本的寄存器的值,具体以下图:
(2)dump_cpu
这个命令显示的寄存器比info r的更全面,并且连影子寄存器的值都打印出来了:
3. 内存内容查询
(1)查询从某个地址开始的N个字节的内存:xp /Nbx 物理地址
例如:xp /32bx 0x90000 查询从0x90000开始的32个字节内容
(2)打印当前栈里的内容:print-stack
下面的例子里:040803c0是当前运行程序的线性地址,01ff53c0是对应的实际物理地址。
4. 反汇编一段内存:disassemble 起始地址 终止地址
例如:disassemble 0x7c3e 0x7c40 反汇编这段地址的指令
https://blog.csdn.net/ddna/article/details/4997695