zoukankan      html  css  js  c++  java
  • 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”
    命令执行。
    




  • 相关阅读:
    09暑假总结
    给我同学的一点建议
    委托(一个主窗体统计多个从窗体的按钮单击的次数)
    关于C#写的记事本中一个问题
    IT行业最重要的四件宝我的实习体会
    使用结构、数组、循环和DataGridView写的分数统计小程序
    Visual Studio 2005 打不开,一直停在启动画面问题
    解决Cannot open the disk 'F:/vmware/Ubuntu.vmdk' or one of the snapshot disks it depends on.
    设计原则笔记
    交叉表组件
  • 原文地址:https://www.cnblogs.com/weiweishuo/p/3082613.html
Copyright © 2011-2022 走看看