0%

bochs调试

bochs调试

bochs的硬件调试体现在:

  • 调试时可以查看页表、gdt、idt等数据结构
  • 可以查看栈中数据
  • 可以反汇编任意内存
  • 实模式、保护模式互相变换时提醒
  • 中断发生时提醒

调试命令大体分为四类:

  • Debugger Control

    • q退出、set设置寄存器的值、ctrl + c 中断执行
    • show mode每当CPU变换模式时就提醒
    • show int每当中断就提示,三种中断类型:
      • softint : 软件主动触发的中断
      • extint : 来自外部设备的中断
      • iret : 只显示iretd指令有关的信息
    • show call : 每当有函数调用时提示
  • Execution Control

    • c/cont/continue:继续执行,若没断点一直运行下去
    • s/step [count]:单步执行,若无count,默认为1
    • p/n/next:执行一条指令,若是函数调用,则把函数当成整体执行
  • Breakpoint management

    • 给地址加断点

      • vb/vbreak [seg:off]给虚拟地址加断点(段:段内偏移)

      • lb/lbreak给线性地址加断点

      • pb/pbreak/b/break [addr]给物理地址加断点

    • 给指令数加断点

      • sb [delta]: delta表示增量,再执行delta条指令中断
      • sba [time]: CPU从运行开始,执行第time条指令时中断,从0开始的指令数
    • 以读写IO加断点

      • watch r/read [phy_addr]: 设置读断点,如果物理地址phy_addr有读操作则停止运行
      • watch w/write [phy_addr]: 设置写断点,如果物理地址phy_addr有写操作则停止运行
      • watch/blist : 显示所有读写断点/信息
      • unwatch [phy_addr] : 为空清除所有读写断点,否则清除phy_addr处的断点
      • bpd/bpe [n] :禁用断点或启用断点,n是断点号
      • d/del/delete [n]: 删除某断点,n是断点号
  • CPU and memory contents

    • x /nuf [line_addr]:显示线性地址的内容
    • xp /nuf [phy_addr] :显示物理地址的内容
    • setpmem [phy_addr][size] [val] :设置以物理内存phy_addr为起始,连续size个字节的内容为val
    • r/reg/regs/registers: 查看8个寄存器的值+eflags寄存器+eip寄存器
    • print-stack [num] 显示堆栈,默认16,表示打印的栈条目数
    • info pb/CPU/fpu/idt/gdt/ldt/tss/ivt: 断点、CPU、FPU、中断向量表、全局描述符表、局部描述符表、任务状态段、中断向量表
    • info flags/eflags:查看状态寄存器
    • sreg/dreg/creg: 显示所有段、调试、控制寄存器的值
    • info tab : 显示页表中线性地址到物理地址的映射
    • page line_addr : 显示线性地址到物理地址的映射