Bochs 除錯技術(轉)

ba發表於2007-08-11
Bochs 除錯技術(轉)[@more@]  對於任何想嘗試寫自己的作業系統的朋友來說,我都要向你推薦Bochs。這個模擬器最大的好處就是可以單步除錯。

  這裡主要是講述Bochs的除錯命令,如何配置Bochs,請參考bochsrc-sample.txt,寫一個自己的bochsrc.txt。Bochsrc-sample.txt的說明很詳細,相信應該沒有問題。這裡是一個作者給FREOS所配置的例子,僅供參考。然後執行bochsdbg.exe(除錯模式)。注意:bochs.exe是執行模式,不能除錯的。除錯模式將出現下列命令列:

bochs:1>


下面初步說明一下每條指令的用法:

執行控制命令
c 繼續執行,遇到斷點將停止
stepi [count] 執行count條指令, 預設為1條
si [count] stepi的縮寫
step [count] 執行count條指令, 預設為1條
s [count] step的縮寫
Ctrl-C 停止執行,返回命令列
Ctrl-D 執行完所有命令後,退出
quit 退出偵錯程式
q quit縮寫

設定斷點
vbreak seg:off 在指定的虛擬地址(段+偏移)設定斷點,在保護模式下也可以使用
vb seg:off

lbreak addr 在一個線性地址設定斷點
lb addr

pbreak
  • addr 在一個實體地址設定斷點
    pb
  • addr
    break
  • addr
    b
  • addr

    info break 顯示所有斷點狀態
    例如:
    --------------------------------------
    Num Type Disp Enb Address
    1 pbreakpoint keep y 0x00007c00
    表示在實體地址0x00007c00設定一個斷點,該斷點目前有效
    ---------------------------------------
    delete n 刪除一個斷點
    del n
    d n

    關於實體地址,線性地址和虛擬地址的區別,我只能憑我的理解簡單說說,可能不準確。實體地址在什麼時候都存在,但是在採用分頁技術和虛擬記憶體技術後,你很難確定實體地址在那裡,所以建議在真實模式下采用實體地址和線性地址形式,這時候實體地址和線性地址其實是一致的。最常用的,比方說,計算機啟動後的地址是0xfff0:0000,裝載BIOS,然後轉移到0x07C0:0000,所以總可以設定一個物理斷點0x7C00,開始除錯你的bootloader。
    檢視記憶體
    x /nuf addr 檢視一個線性地址的記憶體
    xp /nuf addr 檢視一個實體地址的記憶體
    n 顯示多少個單位的記憶體
    u 記憶體單位大小,可以是
    b 位元組
    h 字(2個位元組)
    w 雙字(4個位元組)
    g 4字(8位元組)
    注意: 它們不太符合Intel位元組命名格式,但是遵守GDB約定。
    f 列印格式,可以是
    x 16進位制格式列印
    d 10進位制格式列印
    u 無符號10進位制格式列印
    o 8進位制格式列印
    t 2進位制格式列印

    n,f,和u是可選引數。U和f預設為你最後使用的引數, 如果是第一次使用,u預設為w,f預設為x, n預設為1。如果沒有指定nuf,那麼/也可以不要。setpmem addr datasize val 設定實體地址addr,大小datasize的記憶體單元的值為val.

    crc addr1 addr2 對實體地址範圍addr1到addr2進行CRC校驗?(沒用過)info dirty 顯示寫過的頁?(沒用過)


    Info
    info program 檢視程式的執行狀態
    info registers 列舉CPU整型暫存器遺蹟它們的內容
    info break 顯示當前斷點資訊
    where 列印當前call stack

    暫存器操作
    set $reg = val 改變暫存器的內容。可改變的暫存器有:
    eax, ecx, edx, ebx, esp, ebp, esi, edi.
    不可改變的暫存器有:
    eflags, cs, ss, ds, es, fs, gs.

    例如 set $eax = 0x01234567
    set $edx = 25

    info registers 顯示暫存器內容
    dump_cpu 檢視所有與CPU相關的暫存器狀態
    set_cpu 設定所有與CPU相關的暫存器狀態
    dump_cpu和set_cpu格式如下:
    "eax:0x%x "
    "ebx:0x%x "
    "ecx:0x%x "
    "edx:0x%x "
    "ebp:0x%x "
    "esi:0x%x "
    "edi:0x%x "
    "esp:0x%x "
    "eflags:0x%x "
    "eip:0x%x "
    "cs:s=0x%x, dl=0x%x, dh=0x%x, valid=%u "
    "ss:s=0x%x, dl=0x%x, dh=0x%x, valid=%u "
    "ds:s=0x%x, dl=0x%x, dh=0x%x, valid=%u "
    "es:s=0x%x, dl=0x%x, dh=0x%x, valid=%u "
    "fs:s=0x%x, dl=0x%x, dh=0x%x, valid=%u "
    "gs:s=0x%x, dl=0x%x, dh=0x%x, valid=%u "
    "ldtr:s=0x%x, dl=0x%x, dh=0x%x, valid=%u "
    "tr:s=0x%x, dl=0x%x, dh=0x%x, valid=%u "
    "gdtr:base=0x%x, limit=0x%x "
    "idtr:base=0x%x, limit=0x%x "
    "dr0:0x%x "
    "dr1:0x%x "
    "dr2:0x%x "
    "dr3:0x%x "
    "dr4:0x%x "
    "dr5:0x%x "
    "dr6:0x%x "
    "dr7:0x%x "
    "tr3:0x%x "
    "tr4:0x%x "
    "tr5:0x%x "
    "tr6:0x%x "
    "tr7:0x%x "
    "cr0:0x%x "
    "cr1:0x%x "
    "cr2:0x%x "
    "cr3:0x%x "
    "cr4:0x%x "
    "inhibit_int:%u "
    "done "


    反彙編 disassemble start end 反彙編的地址範圍 set $disassemble_size = n 告訴偵錯程式,反彙編段的屬性(16位或32位,預設32位)。上述的一些命令都是bochs常用的命令,是根據bochs自帶的英文文件翻譯的。
  • 來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-947631/,如需轉載,請註明出處,否則將追究法律責任。

    相關文章