bochs調試方法

bochs一般用法

bochs是一個開源x86虛擬機軟件。在他的實現中定義了各種數據結構來模擬硬件,用軟件模擬硬件速度慢。
bochs的硬件調試體現在:
1)可以查看頁表、gdt、idt等數據結構
2)可以查看棧中數據
3)可以反彙編任意內存
4)實模式、保護模式互相變換時提醒
5)中斷髮生時提醒
bochs中x和xp命令都是用來查看內存的,它們兩個的區別在於x命令用於查看線性地址,而xp用來查看物理地址。之前的章節介紹過在實模式下只有物理地址,保護模式纔有線性地址的概念。所以實模式下只能用xp命令。
注意bochs裏的"字"是4字節。
表示大小的單位:
b 一個字節
h 半個字,2個字節
w 一個字,4個字節
g 雙字,8個字節
用xp和x命令查看的內容是以“顯示單元”爲單位,不是以字節爲單位。所以如果不指定數據大小,默認以4字節爲單位。
bochs中各進制寫法也不同
八進制:011(以0開頭)
十進制:11
十六進制:0x11(只支持0x開頭)
xp命令用法xp /nuf<addr>,nuf是一個數字序列,每個字母都有對應含義。
n用來指定要顯示的單元數。
u指顯示單元大小。最終要顯示幾個字節,是n*u來決定的
f是指用哪種進制顯示。
以下是沒有被BIOS加載MBR前的內存查看情況,分別用不同顯示方式展示。
在這裏插入圖片描述
查看下BIOS程序。可以看到cs:ip,這是BIOS程序的入口地址
在這裏插入圖片描述
u反彙編指令,可以將二進制數據反彙編成彙編指令。
在這裏插入圖片描述
由此可以發現BIOS在該位置進行了一次遠轉移指令。
Debugger control類指令
q|quit|exit,左邊任意一個都能退出調試狀態,關閉虛擬機
set指令族,用於設置寄存器比較常用
1)例如set reg=val。可以色湖之的寄存器包括通用寄存器和段寄存器
2)也可以設置每次停止執行時,是否反彙編指令:set u on|off
show指令族
1.show mode
每次CPU變換模式的時候就進行提示,實模式、保護模式的切換等。
2.show int
每次有中斷的時候就提示,同時顯示3中中斷類型,softint、extint和iret。可以單獨顯示某種類中斷,如執行show siftint只顯示軟中斷,show extint只顯示來自外部設備中斷,show iret只顯示iretd指令有關信息的中斷。
3.show call
每次有函數調用的時候就提示。
trace on|off如果設置爲on,每執行一條指令,bochs就會將反彙編的代碼打印到控制檯
Execution control類指令
c|cont|continue,左邊列出指令都代表向下執行,若沒有斷點就會一直執行下去。
s|step [count]執行count條指令,count是指單步步入執行的指令數,若不指定默認爲1,遇到call會進入call執行
p|n|next單步步過指令,遇到call會把整個call當作1條指令執行。
Breakpoint management類指令
vb|vbreak [seg:off]以虛擬地址添加斷點,程序執行到虛擬地址時停下來,注意虛擬地址時段內偏移的形式。
lb|lbreak[addr]以線性地址添加斷點,程序執行到此線性地址時停下來。
pb|pbreak|b|break [addr]以物理地址添加斷點。程序執行到此物理地址時停下來。b比較常用。
sb[delta] delta表示增量,意爲再執行delta指令程序就中斷。
sba[time]CPU從運行開始,執行第tim條指令中斷,從0開始的指令數。
以讀些IO打斷點:
watch也有子命令,常用爲以下兩個
watch r|read [phy_addr]設置讀斷點,如果物理地址phy_addr有讀操作則停止運行。
watch w|write [phy_addr]設置寫斷點,如果物理地址phy_addr有寫操作則停止運行。此命令非常有用如果某塊地址內存不知何時被改寫了,可以設置此中斷。
watch 顯示所有讀寫斷電
unwatch 清除所有斷點
unwatch [phy_addr] 清除在此地址上的讀些斷點
blist 顯示所有斷點信息,功能等同於info b
bpd|bpe [n] 禁用斷點/啓用斷點,n是斷點號,可以用blist指令先查出來。
d|del|delete [n]刪除某斷點。
CPU and memory contents類指令
x /nuf [line_addr]顯示線性地址的內容。n、u、f三個參數都可選,如果沒有指定,n爲1,是4個字節,f是16進制。
n顯示的單元數
u每個單元數大小,u可以是下列之一:
1)b 1字節
2)h 2字節
3)w 4字節
4)g 8字節
f顯示格式,f可以是下列之一:
1)x十六進制
2)d十進制
3)u無符號
4)o八進制
5)t二進制
6)c字符顯示
7)s按照ASCIIz顯示
8)i按照instr顯示
xp /nuf [phy_addr]與x指令參數相同,用於顯示物理地址。
setpmem [phy_addr] [size] [val]設置以物理地址phy_addr開始,連續size個字節的內容爲val。
size最多隻能設置4個字節寬度的數據。
r|reg|regs|registers 任意四個命令之一可以顯示8個通用寄存器的指+eflag寄存器+eip寄存器
ptime顯示Bochs啓動之後,總執行指令數。
printf-stack [num]顯示堆棧,num默認爲16,表示打印棧的條目數。輸出內容是棧頂在上,低地址在上,高地址在下。
?|calc 內置計算器
info是個指令族,執行help info時可以查看其所有支持的子命令,如下:
info pb|pbreak|b|break
info CPU 顯示CPU所有寄存器的值
info fpu顯示FPU狀態
info idt顯示中斷向量表
info gdt[num] 顯示全局描述表GDT,如果加了num,只顯示gdt中的num項描述符。
info ldt顯示全局描述符表LDT。
info tss 顯示任務狀態段TSS
info ivt [num] 顯示中斷向量表IVT。和gdt一樣,如果制定了num,則只會顯示第num項的中斷向量。
在這裏插入圖片描述
info flags|eflags 顯示狀態寄存器,r也可以做到
sreg 顯示所有段寄存器的值。
creg 顯示所有控制寄存器的值。
info tab 顯示頁表中線性地址到物理地址的映射。
page line_addr 顯示線性地址到獨立地址簡單映射。

發佈了16 篇原創文章 · 獲贊 1 · 訪問量 1105
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章