Bochs 调试

   Bochs的调试命令风格是按照GDB习惯来设计的,这对于用惯了WinDbg的人来说无疑是痛苦的,好在这是个开源软件,看着不顺眼可以考虑自己改改。
     目前版本的Bochs(Version 2.1.1)支持的调试命令如下:
[注意]
1、Bochs的文档和帮助信息中的使用说明与真实情况之间存在很大的差错和缺失,   下面的命令说明根据源码作了很多补充和修正。
2、其中涉及到的seg(段)、off(偏移)、addr(地址)、val(值)等数字, 可以使用十六进制、十进制或者八进制,但必须按照如下形式书写:
十六进制   0xCDEF0123
八进制     01234567
十进制     123456789
尤其要注意,Bochs不能自动识别16进制的数字,也不接受12345678h这种写法。
[执行控制]
c|cont                           向下执行。
s|step|stepi [count]     单步执行,count 默认为 1。
p|n|next                      单步执行。
q|quit|exit                   退出调试,同时关闭虚拟机。
Ctrl-C                          结束执行状态,返回调试器提示符。
Ctrl-D                          if at empty line on command line, exit
[执行断点]
vb|vbreak [seg:off]               在虚拟地址上下断点。
lb|lbreak [addr]                    在线性地址上下断点。
pb|pbreak|b|break [addr]    在物理地址上下断点。
blist                                      显示断点状态。
bpd|bpe [num]                    禁用/启用断点。num是断点号,可以用blist命令查询。
d|del|delete [num]              删除断点。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:
这样是可以的:
   setpmem 0x00000000 0x4 0x11223344
x /4 0x00000000
[bochs]:
0x00000000 :     0x11223344 0x00000000 0x00000000 0x00000000
这样也可以:
   setpmem 0x00000000 0x2 0x11223344
x /4 0x00000000
[bochs]:
0x00000000 :     0x00003344 0x00000000 0x00000000 0x00000000
或者:
   setpmem 0x00000000 0x1 0x20
x /4 0x00000000
[bochs]:
0x00000000 :     0x00000020 0x00000000 0x00000000 0x00000000
下面的做法都会导致出错:
   setpmem 0x00000000 0x3 0x112233
Error: setpmem: bad length value = 3
   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状态。
dump_cpu和set_cpu格式如下:
    "eax:0x%x\n"
    "ebx:0x%x\n"
    "ecx:0x%x\n"
    "edx:0x%x\n"
    "ebp:0x%x\n"
    "esi:0x%x\n"
    "edi:0x%x\n"
    "esp:0x%x\n"
    "eflags:0x%x\n"
    "eip:0x%x\n"
    "cs:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n"
    "ss:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n"
    "ds:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n"
    "es:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n"
    "fs:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n"
    "gs:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n"
    "ldtr:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n"
    "tr:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n"
    "gdtr:base=0x%x, limit=0x%x\n"
    "idtr:base=0x%x, limit=0x%x\n"
    "dr0:0x%x\n"
    "dr1:0x%x\n"
    "dr2:0x%x\n"
    "dr3:0x%x\n"
    "dr4:0x%x\n"
    "dr5:0x%x\n"
    "dr6:0x%x\n"
    "dr7:0x%x\n"
    "tr3:0x%x\n"
    "tr4:0x%x\n"
    "tr5:0x%x\n"
    "tr6:0x%x\n"
    "tr7:0x%x\n"
    "cr0:0x%x\n"
    "cr1:0x%x\n"
    "cr2:0x%x\n"
    "cr3:0x%x\n"
    "cr4:0x%x\n"
    "inhibit_int:%u\n"
    "done\n"
[反汇编命令]
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                   计算表达式的值。
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网卡信息。
上述的一些命令都是bochs常用的命令。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值