注意:調試版的bochs必須在編譯的時候加: --enable-debugger
to the configure line in .conf.win32-vcppsass
bochs調試FAQ:函數
1. Q:如何從引導扇區開始設置斷點?ui
A: BIOS被載入內存中運行,其引導扇區的地址通常都是在0x7c00,由於在實模式下,邏輯地址和物理地址是一一對應的, 因此咱們能夠在啓動bochs調試的命令行下輸入spa
pb 0x7c00 或者 vb 0:0x7c00.net
就着輸入命令行
cdebug
bochs就會在0x7c00處停下 調試
2. Q: 我想在單步執行(s)後看到寄存器的變化狀況, 該怎麼設置?code
A: 輸入blog
trace-reg on
後, 再執行單步調試的時候都會顯示寄存器的當前狀態了.
3. Q: 在單步調試的時候,遇到一個調用子程序的指令,輸入s會把調試跳進子程序中,如何只執行子程序而不要陷進去調試?
A: 在調試子程序的指令處,不用s改成n或p
4. Q: 查看當前堆棧的命令?
A: print-stack
Table 1. 部分Bochs調試指令
行爲 |
指令 |
舉例 |
在某物理地址設置斷點 |
b addr |
b 0x30400 |
顯示當前全部斷點信息 |
info break |
info break |
繼續執行,直到趕上斷點 |
c |
c |
單步執行 |
s |
s |
單步執行(遇到函數則跳過) |
n |
n |
查看寄存器信息 |
info cpu r fp sreg creg |
info cpu r fp sreg creg |
查看堆棧 |
print-stack |
print-stack |
查看內存物理地址內容 |
xp /nuf addr |
xp /40bx 0x9013e |
查看線性地址內容 |
x /nuf addr |
x /40bx 0x13e |
反彙編一段內存 |
u start end |
u 0x30400 0x3040D |
反彙編執行的每一條指令 |
trace-on |
trace-on |
每執行一條指令就打印CPU信息 |
trace-reg |
trace-reg on |
其中"xp /40bx 0x9013e"這樣的格式可能顯得有點複雜,讀者能夠用"help x"這一指令在Bochs中親自看一下它表明的意義
c|cont 向下執行,至關於WinDBG的「g」。
s|step|stepi [count] 單步執行,至關於WinDBG的「t」,count 默認爲 1。
p|n|next 單步執行,相似於WinDBG的「p」。
q|quit|exit 退出調試,同時關閉虛擬機。
Ctrl-C 結束執行狀態,返回調試器提示符。
Ctrl-D if at empty line on command line, exit
(至少在Windows版本中我沒有發現Ctrl-D有什麼功能)
vb|vbreak [seg:off] 在虛擬地址上下斷點。
lb|lbreak [addr] 在線性地址上下斷點,至關於WinDBG的「bp」。
pb|pbreak|b|break [addr] 在物理地址上下斷點。(爲了兼容GDB的語法,地址前能夠加上一個「*」)。
blist 顯示斷點狀態,至關於WinDBG的「bl」。
bpd|bpe [num] 禁用/啓用斷點,WinDBG的「be」和「bd」。num是斷點號,能夠用blist命令查詢。
d|del|delete [num] 刪除斷點,至關於WinDBG的「bc」。mum是斷點號,可
以用blist命令查詢。
watch read [addr] 設置讀斷點。
watch write [addr] 設置寫斷點。
unwatch read [addr] 清除讀斷點。
unwatch write [addr] 清除寫斷點。
watch 顯示當前全部讀寫斷點。
unwatch 清除當前全部讀寫斷點。
watch stop|continue 開關選項,設置遇到讀寫斷點時中斷下來仍是顯示出來但
是繼續運行。
x /nuf [addr] 顯示線性地址的內容
xp /nuf [addr] 顯示物理地址的內容
n 顯示的單元數
u 每一個顯示單元的大小,u能夠是下列之一:
b BYTE
h WORD
w DWORD
g DWORD64
注意: 這種命名法是按照GDB習慣的,而並非按照inter的規範。
f 顯示格式,f能夠是下列之一:
x 按照十六進制顯示
d 十進制顯示
u 按照無符號十進制顯示
o 按照八進制顯示
t 按照二進制顯示
c 按照字符顯示
n、f、u是可選參數,若是不指定,則u默認是w,f默認是x。若是前面使用過x或
者xp命令,會按照上一次的x或者xp命令所使用的值。n默認爲1。addr 也是一個
可選參數,若是不指定,addr是0,如過前面使用過x或者xp命令,指定了n=i,
則再次執行時n默認爲i+1。
setpmem [addr] [size] [val] 設置物理內存某地址的內容。
須要注意的是,每次最多隻能設置一個DWORD:
這樣是能夠的:
<bochs:1> setpmem 0x00000000 0x4 0x11223344
<bochs:2> x /4 0x00000000
[bochs]:
0x00000000 <bogus+ 0>: 0x11223344 0x00000000 0x00000000 0x00000000
這樣也能夠:
<bochs:1> setpmem 0x00000000 0x2 0x11223344
<bochs:2> x /4 0x00000000
[bochs]:
0x00000000 <bogus+ 0>: 0x00003344 0x00000000 0x00000000 0x00000000
或者:
<bochs:1> setpmem 0x00000000 0x1 0x20
<bochs:2> x /4 0x00000000
[bochs]:
0x00000000 <bogus+ 0>: 0x00000020 0x00000000 0x00000000 0x00000000
下面的作法都會致使出錯:
<bochs:1> setpmem 0x00000000 0x3 0x112233
Error: setpmem: bad length value = 3
<bochs:2> setpmem 0x00000000 0x8 0x11223344
Error: setpmem: bad length value = 8
crc [start] [end] 顯示物理地址start到end之間數據的CRC。
set $reg = val 設置寄存器的值。如今版本能夠設置的寄存器包括:
eax ecx edx ebx esp ebp esi edi
暫時不能設置:
eflags cs ss ds es fs gs
r|reg|registers reg = val 同上。
dump_cpu 顯示完整的CPU信息。
set_cpu 設置CPU狀態,這裏能夠設置dump_cpu所能顯示出來的全部CPU狀態。
u|disas|disassemble [/num] [start] [end]
反彙編物理地址start到end 之間的代碼,如
果不指定參數則反彙編當前EIP指向的代碼。
num是可選參數,指定處理的代碼量。
set $disassemble_size = 0|16|32 $disassemble_size變量指定反彙編使用的段
大小。
set $auto_disassemble = 0|1 $auto_disassemble決定每次執行中斷下來的
時候(例如遇到斷點、Ctrl-C等)是否反匯
編當前指令。
trace-on|trace-off Tracing開關打開後,每執行一條指令都會將反彙編的結果
顯示出來。
ptime 顯示Bochs自本次運行以來執行的指令條數。
sb [val] 再執行val條指令就中斷。val是64-bit整數,以L結尾,形如「1000L」
sba [val] 執行到Bochs自本次運行以來的第val條指令就中斷。val是64-bit整數,以L結尾,形如「1000L」
modebp 設置切換到v86模式時中斷。
record ["filename"] 將輸入的調試指令記錄到文件中。文件名必須包含引號。
playback ["filename"] 回放record的記錄文件。文件名必須包含引號。
print-stack [num] 顯示堆棧,num默認爲16,表示打印的條數。
?|calc 和WinDBG的「?」命令相似,計算表達式的值。
load-symbols [global] filename [offset]
載入符號文件。若是設定了「global」關鍵字,則符號針對全部上下文都有效。offset會默認加到全部的symbol地址上。symbol文件的格式爲:"%x %s"。
info program 顯示程序執行的狀況。
info registers|reg|r 顯示寄存器的信息。
info pb|pbreak|b|break 至關於blist
info dirty 顯示髒頁的頁地址。
info cpu 顯示全部CPU寄存器的值。
info fpu 顯示全部FPU寄存器的值。
info idt 顯示IDT。
info gdt [num] 顯示GDT。
info ldt 顯示LDT。
info tss 顯示TSS。
info pic 顯示PIC。
info ivt [num] [num] 顯示IVT。
info flags 顯示狀態寄存器。
info cr 顯示CR系列寄存器。
info symbols 顯示symbol信息。
info ne2k|ne2000 顯示虛擬的ne2k網卡信息。
Bochs經常使用調試命令
Bochs是很是好用的模擬器,命令也不少,不過最經常使用的其實總結起來也就包括幾條,記住這些命令基本均可以知足調試需求了。
1. 斷點操做
(1)設置斷點:b 物理地址
例:b 0x7c00 在物理地址0x7c00處設置斷點
(2)查詢目前已經設置過的斷點:info break
2. 程序的執行
(1)執行程序,直到遇到斷點: c
(2)單步執行:s
(3)執行N條指令:step N
例如執行3條指令: step 3
2. 寄存器值查詢
(1)info r 這條指令會查詢基本的寄存器的值,具體以下圖:
(2)dump_cpu
這個命令顯示的寄存器比info r的更全面,並且連影子寄存器的值都打印出來了:
3. 內存內容查詢
(1)查詢從某個地址開始的N個字節的內存:xp /Nbx 物理地址
例如:xp /32bx 0x90000 查詢從0x90000開始的32個字節內容
(2)打印當前棧裏的內容:print-stack
下面的例子裏:040803c0是當前運行程序的線性地址,01ff53c0是對應的實際物理地址。
4. 反彙編一段內存:disassemble 起始地址 終止地址
例如:disassemble 0x7c3e 0x7c40 反彙編這段地址的指令
https://blog.csdn.net/ddna/article/details/4997695