• bochs调试心得


    1,让调试错误信息显示到控制台

      作者在第三章讲DPL时,设计了一个保护异常的出错例子(50页):将DPL设为1,RPL设为3,编译运行,结果“系统崩溃,bochs重启,在控制台你能看到这样的字样:load_seg_reg(ds):RPL&amp;RPL must be <=DPL”

      可我专门找了一个上午都没有找到出错信息,最后发现bochs的调试出错信息默认都被重定向到bochsout.txt文件里去了。

      要想让出错信息重回控制台,把配置文件.bochsrc里“log: Bochsout.txt ”这行用#号注释掉就OK了。

      bochs在退出或崩溃时都会输出有关信息(到控制台或是Bochsout.txt),对调试自己的操作系统而言,这样的信息绝对重要。我一直是将配置文件中的这行保持注释的。


    2,x /2 0x7c00 查看0x7c00地址开始,往下的两个双字!注意是双字

      在网上查到的
      -------------------------------------------------------
      x/nuf addr 查看一个物理地址的内存
      例如 x /2 0x7c00
      功能:查看0x7c00地址开始,往下的两个双字!注意是双字!即u=w
      在16位汇编时,还是指定u参数取h较直观。
      下面是具体参数介绍(我上面只指定了n参,u参默认为双字)
      n 显示多少个单位的内存
      u 内存单位大小,可以是
      b 字节
      h 字(2个字节)
      w 双字(4个字节)
      g 4字(8字节)

      注意: 它们不太符合Intel字节命名格式,


    3,dh,dl表示描述符的高16位,低16位

      通常输入info cpu,会得到类似下面的结果:

    ----------------------------------------------------------------------------------------------------------------------------------------

    1 1eax:0x8000844c, ebx:0x00000000, ecx:0x00000000, edx:0x00000000
    2  ebp:0x00000000, esp:0x000001f0, esi:0xffff88ca, edi:0x00000000
    3  eip:0x00000013, eflags:0x00000086, inhibit_mask:0
    4  cs:s=0x0024, dl=0x84540018, dh=0x00409800, valid=1
    5  ss:s=0x0014, dl=0x805401ff, dh=0x00409300, valid=5
    6  ds:s=0x0000, dl=0x00000000, dh=0x00000000, valid=0
    7  es:s=0x0000, dl=0x00000000, dh=0x00000000, valid=0
    8  fs:s=0x0000, dl=0x00000000, dh=0x00000000, valid=0
    9  gs:s=0x0013, dl=0x8000ffff, dh=0x000cf30b, valid=5
    10  ldtr:s=0x0018, dl=0x7e380047, dh=0x00008200, valid=1
    11  tr:s=0x0028, dl=0x7e800069, dh=0x00008900, valid=1
    12  gdtr:base=0x00007e00, limit=0x2f
    13  idtr:base=0x00000000, limit=0x3ff
    14  dr0:0x00000000, dr1:0x00000000, dr2:0x00000000
    15  dr3:0x00000000, dr6:0xffff0ff0, dr7:0x00000400
    16  cr0:0x80000011, cr1:0x00000000, cr2:0x00000000
    17  cr3:0x00200000, cr4:0x00000000
    18  done

    ----------------------------------------------------------------------------------------------------------------------------------------


      以第9行的gs为例

      dh,dl分别对应描述符的高16位,低16位

      [ 0 0 0 c f 3 0 b][ 8 0 0 0 f f f f ]


      我起初总是把dh,dl往投影寄存器上想,折腾了很久很久之后才幡然醒悟,d就是descriptor的简写,是我想多了。

      感觉bochs的设计者的思维有点儿反,他因该先输出dh,再输出dl,这样容易左右连接,让人联想到输出64位的的descriptor。或者是我脑子太锈了,实在难过。


    4,单步操作命令s要慎用

      用s命令单步执行完写屏指令,bochs虚拟机的画面并不会更新,什么是写屏命令?像比下面一段指令:

    mov ah,00001010b
    mov al,'y'
    mov bx,2*8
    mov gs,bx
    mov [gs:0],ax
      在调试执行最后一条指令(它就是写屏命令)时,如果仍然用“s”命令来单步执行,bochs的界面左上角并不会出现绿色的“y”字符!不知道是不是bug,这时候因该换作“n”
    命令执行。
    




  • 相关阅读:
    (转)Java任务调度框架Quartz入门教程指南(二) 使用job、trigger、schedule调用定时任务
    (转)Quartz任务调度(1)概念例析快速入门
    如何解决Win10预览版一闪而过的disksnapshot.exe进程?
    【转】SSH中 整合spring和proxool 连接池
    datatables 配套bootstrap3样式使用小结(1)
    PowerDesigner16逆向工程生成PDM列注释(My Sql5.0模版)
    PowerDesigner连接mysql逆向生成pdm
    Power Designer逆向操作(从mysql5.0生成数据库的物理模型)
    范仁义js课程---53、匿名函数应用
    范仁义js课程---52、匿名函数
  • 原文地址:https://www.cnblogs.com/weiweishuo/p/3082613.html
Copyright © 2020-2023  润新知