Bochs 除錯技術(轉)
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
pbreakaddr 在一個實體地址設定斷點
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自帶的英文文件翻譯的。
這裡主要是講述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
pb
break
b
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- bochs除錯教程除錯
- nasm彙編以及bochs除錯ASM除錯
- 掌握 Linux 除錯技術(轉)Linux除錯
- 掌握Linux除錯技術(轉)Linux除錯
- 《除錯九法》:除錯是個技術活除錯
- Web除錯技術詳解Web除錯
- iOS無線除錯技術iOS除錯
- 掌握 Linux 除錯技術Linux除錯
- 深入Java除錯技術 -Ari NomanJava除錯
- Qt入門(10)——除錯技術QT除錯
- Linux技術——gdb除錯基礎Linux除錯
- 嵌入式Linux的除錯技術Linux除錯
- vc6.0程式除錯技術總結除錯
- 加殼技術--DRx解碼阻止除錯除錯
- Windows 反除錯技術——OpenProcess 許可權過濾Windows除錯
- 五種前端開發必備的除錯技術前端除錯
- Java除錯教程--多執行緒除錯(轉)Java除錯執行緒
- PHP程式設計師的除錯技術使用print語句、錯誤報告和PHPEclipse外掛(轉)PHP程式設計師除錯Eclipse
- DLL的除錯 (轉)除錯
- 軟體除錯 (轉)除錯
- 閃回刪除技術:
- 什麼是重複資料刪除技術(轉帖)
- perl除錯哲學(轉)除錯
- dbx除錯過程 (轉)除錯
- vc除錯經驗 (轉)除錯
- Android應用方法隱藏及反除錯技術淺析Android除錯
- 如何技術對接接入AG介面API產品(AG介面除錯)API除錯
- 【同行說技術】Python開發、除錯、爬蟲類工具 大全Python除錯爬蟲
- linux啟動bochsLinux
- [技術討論]程式碼除錯,程式設計師的基本功除錯程式設計師
- ssh配置除錯的必殺技除錯
- (轉)BDC技術
- VDSL技術(轉)
- 核心除錯神器SystemTap 轉摘除錯
- [轉載]uiautomator埠除錯UI除錯
- NO MFC - 使用 .log 除錯程式 (轉)除錯
- 本地除錯PERL CGI程式(轉)除錯
- 用GDB除錯程式(二) (轉)除錯