《操作系统真象还原》学习笔记:bochs调试方法

Debugger control 类

  • q|quit|exit,这三个命令任意一个都能退出调试状态,关闭虚拟机,一般用q最简单
  • set是指令族,通常用set设置寄存器的值
  • 1) 例如set reg = val 。可以设置的寄存器包括通用寄存器和段寄存器。
    2)也可以设置每次停止执行时,是否反汇编指令:set u on|off
  • show是指令族,有很多子功能,常用就下面3个
    1)show mod
        每次cpu变换模式时就提示,模式是指保护模式、实模式,
    2)show int
       每次有中断时就提示,同时显示三种中断类型,“softint”、“extint”和“iret”,可以单独显示某类中断,如执行show softint只显示软件主动触发的中断show extint则只显示来自外部设备的中断,show iret只显示iretd 指令有关的信息
    3)show call
       每次有函数调用发生时就会提示
  • traceon|off 如果此项设为on,每次执行一条指令,bochs都会将反汇编代码打印到控制台,这样在单步调试时免得看源码了。
  • u | disasm  [/num]   [start]   [end]
    将物理地址start到end之间的代码反汇编,如果不指定地址,则反汇编EIP指向的内存,num指定反汇编的指令数。
  • setsize = 16|32|64 在使用反汇编命令时,用来告诉调试器段的大小。
  • ctrl+c 中断执行,回到bochs控制台

Execution control 类

  • c|cont|continue,这三个命令都意为向下持续执行,若没有断点则一直运行下去
  • s|step [count] 执行count条指令,若不指定默认count=1,若遇到函数调用,则会进入函数去执行
  • p|n|next 执行1条指令,若待执行的指令是函数调用,不管函数内有多少指令,把整个函数当作一个整体来执行

Breakpoint management 类

以地址打断点:

  • vb|vbreak [seg:off] 以虚拟地址添加断点,程序执行到此虚拟地址停下来,注意虚拟地址是“段:段内偏移”的形式。vb比较常用
  • lb|lbreak [addr] 以线性地址添加断点,程序执行到此线性地址停下来。lb比较常用
  • pb|pbreak|b|break [addr] 以物理地址添加断点,程序执行到此物理地址停下来。b比较常用

以指令数打断点:

  • sb [delta]  delta表示增量,意味再执行delta条指令程序就中断
  • sba [time] CPU从运行开始,执行第time条指令时中断,从0开始的指令数

以读写IO打断点:

  • wath r|read [phy_addr]   设置读断点,如果物理地址phy_addr有读操作则停止运行
  • wath w|write [phy_addr]   设置写断点,如果物理地址phy_addr有写操作则停止运行
  • watch 显示所有读写断点
  • unwatch 清除所有断点
  • unwatch [phy_addr] 清除在此地址上的读写断点
  • bpd|bpe [n] 禁用断点(break point disable) / 启用断点(break point enable),n是断点号,可以用blist命令先检查出来
  • d|del|delete [n] 删除某断点,n是断点号,可以用blist命令先查出来

CPU and memory contents 类

  • x/nuf [line_addr] 显示线性地址的内容。n、u、f是三个参数,都是可选的,如果没有指定,则默认n=1,u=4,f=x

    n:显示的单元数
    u:每个显示单元的大小
        b 1字节
        h 2字节
        w 4字节
        g 8字节
    f:显示格式
    x 十六进制显示
    d 十进制显示
    u 无符号十进制显示
    o 按照八进制显示
    t 按照二进制显示
    c 按照字符显示
    s 按照ASCLLz显示
    i 按照instr显示

  • xp /nuf [phy_addr] 显示物理地址 phy_addr 处的内容,注意和 x 的区别,x 是线性地址。
  • setpmem [phy_addr] [size] [val] 设置以物理内存 phy_addr 为起始,连续 size 个字节的内容为 val。在某些情况下不易调试时,可以在程序中通过某个地址的值来判断分支,需要用 setpmem 来配合。size 最多只能设置 4 个字节宽度的数据
  • r|reg|regs|registers 任意四个命令之一便可以显示 8 个通用寄存器的值+eflags 寄存器+eip 寄存器。
  • ptime 显示 Bochs 自启动之后,总执行指令数。
  • print-stack [num] 显示堆栈,num 默认为 16,表示打印的栈条目数。输出的栈内容是栈顶在上,低地址在上,高地址在下。这和栈的实际扩展方向相反,这一点请注意。
  • ?|calc 内置的计算器。
  • info 是个指令族,执行 help info 时可查看其所有支持的子命令,如下:
    1)info pb|pbreak|b|break 查看断点信息,等同于 blist。
    2)info CPU 显示 CPU 所有寄存器的值,包括不可见寄存器。
    3)info fpu 显示 FPU 状态。
    4)info idt 显示中断向量表 IDT。
    5)info gdt [num]显示全局描述符表 GDT,如果加了 num,只显示 gdt中第 num 项描述符。
    6)info ldt 显示局部描述符表 LDT。
    7)info tss 显示任务状态段 TSS。
    8)info ivt [num]显示中断向量表 IVT。和 gdt 一样,如果指定了 num,则只会显示第 num 项的中断向量。如果想知道 BIOS 在中断向量表中建立了哪些中断,执行此命令就可以看
  • info flags|eflags 显示状态寄存器,其实在用 r 命令显示寄存器值时也会输出 eflags 的状态,还会输出通用寄存器的值,我通常会用 r 来看。
    sreg 显示所有段寄存器的值。
    dreg 显示所有调试寄存器的值。
    creg 显示所有控制寄存器的值。
    info tab 显示页表中线性地址到物理地址的映射。
    page line_addr 显示线性地址到物理地址间的映射。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值