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的內容為...