bochs除錯技術

2021-06-16 08:36:21 字數 3322 閱讀 6568

bochs除錯技術

除錯模式將出現下列命令列:

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\n"

"ebx:0x%x\n"

"ecx:0x%x\n"

"edx:0x%x\n"

"ebp:0x%x\n"

"esi:0x%x\n"

"edi:0x%x\n"

"esp:0x%x\n"

"eflags:0x%x\n"

"eip:0x%x\n"

"cs:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n"

"ss:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n"

"ds:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n"

"es:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n"

"fs:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n"

"gs:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n"

"ldtr:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n"

"tr:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n"

"gdtr:base=0x%x, limit=0x%x\n"

"idtr:base=0x%x, limit=0x%x\n"

"dr0:0x%x\n"

"dr1:0x%x\n"

"dr2:0x%x\n"

"dr3:0x%x\n"

"dr4:0x%x\n"

"dr5:0x%x\n"

"dr6:0x%x\n"

"dr7:0x%x\n"

"tr3:0x%x\n"

"tr4:0x%x\n"

"tr5:0x%x\n"

"tr6:0x%x\n"

"tr7:0x%x\n"

"cr0:0x%x\n"

"cr1:0x%x\n"

"cr2:0x%x\n"

"cr3:0x%x\n"

"cr4:0x%x\n"

"inhibit_int:%u\n"

"done\n"

反彙編disassemble start end 反彙編的位址範圍

set $disassemble_size = n 告訴偵錯程式,反彙編段的屬性(16位或32位,預設32位)。

Bochs 除錯技術

bochs 除錯技術 freos hobby os frank wang 中國核芯網 對於任何想嘗試寫自己的作業系統的朋友來說,我都要向你推薦bochs。這個模擬器最大的好處就是可以單步除錯。在沒了解它之間,我在寫freos幾乎是瞎子,進展十分緩慢,特別是在你沒有完成顯示器驅動之前,你可以想象,看不...

bochs除錯入門

bochs除錯入門 安裝sudo apt get install vgabios bochs bochs x bximage 建立軟盤 bximage fd一直回車,將在當前目錄下會建立乙個預設大小為1.44m的軟盤名為a.img。dd if boot of a.img bs 512 count 1...

Bochs除錯指令

bochs就像一台真機一樣,處理器在加電之後,要開始取指令並執行指令。jmpf f000 e05b 轉移目標位置rom bios如圖在左側顯示了該指令所在的物理記憶體位址0x0000fffffff0。但為什麼是0x0000fffffff0?因為和8086不同,現代處理器在加電時,段暫存器cs的內容為...