Bochs调试相关命令
2013-03-24 21:58
253 查看
Bochs的调试命令风格是按照GDB习惯来设计的,这对于用惯了WinDbg的人来说无疑是痛苦的,好在这是个开源软件,看着不顺眼可以考虑自己改改。
目前版本的Bochs(Version 2.1.1)支持的调试命令如下:
[注意]
1、Bochs的文档和帮助信息中的使用说明与真实情况之间存在很大的差错和缺失,下面的命令说明根据源码作了很多补充和修正。
2、其中涉及到的seg(段)、off(偏移)、addr(地址)、val(值)等数字,可以使用十六进制、十进制或者八进制,但必须按照如下形式书写:
十六进制 0xCDEF0123
八进制 01234567
十进制 123456789
尤其要注意,Bochs不能自动识别16进制的数字,也不接受12345678h这种写法。
[执行控制]
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命令]
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网卡信息。
弄明白了调试命令,接下来就可以着手进行NTLDR的调试工作了
目前版本的Bochs(Version 2.1.1)支持的调试命令如下:
[注意]
1、Bochs的文档和帮助信息中的使用说明与真实情况之间存在很大的差错和缺失,下面的命令说明根据源码作了很多补充和修正。
2、其中涉及到的seg(段)、off(偏移)、addr(地址)、val(值)等数字,可以使用十六进制、十进制或者八进制,但必须按照如下形式书写:
十六进制 0xCDEF0123
八进制 01234567
十进制 123456789
尤其要注意,Bochs不能自动识别16进制的数字,也不接受12345678h这种写法。
[执行控制]
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命令]
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网卡信息。
弄明白了调试命令,接下来就可以着手进行NTLDR的调试工作了
相关文章推荐
- bochs调试命令总结
- Bochs 常用调试命令
- windbg调试相关命令
- wpa_cli P2P 连接相关调试命令
- Bochs常用调试命令
- wpa_cli P2P 连接相关调试命令
- Bochs调试及相关仿真工具的使用方法
- Bochs调试命令
- Bochs常用调试命令
- perl 调试命令的相关知识小结
- WinDbg学习笔记八 - 内核调试常用命令2 - 进程相关
- 《自己动手写操作系统》第二章——Bochs调试及相关仿真工具的使用方法
- bochs调试命令
- bochs2.6.9 配置文件详解.和相关调试到虚拟机运行
- Bochs常用调试命令
- GDB调试命令(二)---反汇编相关
- GDB调试相关命令
- WinDbg学习笔记九 - 内核调试常用命令3 - 线程相关
- linux下iostat命令解析 (性能相关以及性能调试)
- linux cpu 内存 硬盘 系统性能调试相关命令