Bochs调试指令
1.?????? Q:如何從引導(dǎo)扇區(qū)開(kāi)始設(shè)置斷點(diǎn)?
A: BIOS被載入內(nèi)存中運(yùn)行,其引導(dǎo)扇區(qū)的地址一般都是在0x7c00,因?yàn)樵趯?shí)模式下,邏輯地址和物理地址是一一對(duì)應(yīng)的, 所以我們可以在啟動(dòng)bochs調(diào)試的命令行下輸入
??????? pb 0x7c00 或者 vb 0:0x7c00
就著輸入
??????? c
bochs就會(huì)在0x7c00處停下
?
2.?????? Q: 我想在單步執(zhí)行(s)后看到寄存器的變化情況, 該怎么設(shè)置?
A: 輸入
?????????????? trace-reg on
?? 后, 再執(zhí)行單步調(diào)試的時(shí)候都會(huì)顯示寄存器的當(dāng)前狀態(tài)了.
?
3.?????? Q: 在單步調(diào)試的時(shí)候,遇到一個(gè)調(diào)用子程序的指令,輸入s會(huì)把調(diào)試跳進(jìn)子程序中,如何只執(zhí)行子程序而不要陷進(jìn)去調(diào)試?
A: 在調(diào)試子程序的指令處,不用s改為n或p
4.?????? Q: 查看當(dāng)前堆棧的命令?
A: print-stack
?
Table 1. 部分Bochs調(diào)試指令
| 行為 | 指令 | 舉例 |
| 在某物理地址設(shè)置斷點(diǎn) | b addr | b 0x30400 |
| 顯示當(dāng)前所有斷點(diǎn)信息 | info break | info break |
| 繼續(xù)執(zhí)行,直到遇上斷點(diǎn) | c | c |
| 單步執(zhí)行 | s | s |
| 單步執(zhí)行(遇到函數(shù)則跳過(guò)) | n | n |
| 查看寄存器信息 | info cpu r fp sreg creg | info cpu r fp sreg creg |
| 查看堆棧 | print-stack | print-stack |
| 查看內(nèi)存物理地址內(nèi)容 | xp /nuf addr | xp /40bx 0x9013e |
| 查看線性地址內(nèi)容 | x /nuf addr | x /40bx 0x13e |
| 反匯編一段內(nèi)存 | u start end | u 0x30400 0x3040D |
| 反匯編執(zhí)行的每一條指令 | trace-on | trace-on |
| 每執(zhí)行一條指令就打印CPU信息 | trace-reg | trace-reg on |
其中"xp /40bx 0x9013e"這樣的格式可能顯得有點(diǎn)復(fù)雜,讀者可以用"help x"這一指令在Bochs中親自看一下它代表的意義
?
[執(zhí)行控制]
?
c|cont 向下執(zhí)行,相當(dāng)于WinDBG的“g”。
?
s|step|stepi [count] 單步執(zhí)行,相當(dāng)于WinDBG的“t”,count 默認(rèn)為 1。
?
p|n|next 單步執(zhí)行,類似于WinDBG的“p”。
?
q|quit|exit 退出調(diào)試,同時(shí)關(guān)閉虛擬機(jī)。
?
Ctrl-C 結(jié)束執(zhí)行狀態(tài),返回調(diào)試器提示符。
?
Ctrl-D if at empty line on command line, exit
(至少在Windows版本中我沒(méi)有發(fā)現(xiàn)Ctrl-D有什么功能)
?
[執(zhí)行斷點(diǎn)]
?
vb|vbreak [seg:off] 在虛擬地址上下斷點(diǎn)。
?
lb|lbreak [addr] 在線性地址上下斷點(diǎn),相當(dāng)于WinDBG的“bp”。
?
pb|pbreak|b|break [addr] 在物理地址上下斷點(diǎn)。(為了兼容GDB的語(yǔ)法,地址前
可以加上一個(gè)“*”)。
?
blist 顯示斷點(diǎn)狀態(tài),相當(dāng)于WinDBG的“bl”。
?
bpd|bpe [num] 禁用/啟用斷點(diǎn),WinDBG的“be”和“bd”。num是斷
點(diǎn)號(hào),可以用blist命令查詢。
?
d|del|delete [num] 刪除斷點(diǎn),相當(dāng)于WinDBG的“bc”。mum是斷點(diǎn)號(hào),可
以用blist命令查詢。
?
[讀寫(xiě)斷點(diǎn)]
?
watch read [addr] 設(shè)置讀斷點(diǎn)。
watch write [addr] 設(shè)置寫(xiě)斷點(diǎn)。
unwatch read [addr] 清除讀斷點(diǎn)。
unwatch write [addr] 清除寫(xiě)斷點(diǎn)。
watch 顯示當(dāng)前所有讀寫(xiě)斷點(diǎn)。
unwatch 清除當(dāng)前所有讀寫(xiě)斷點(diǎn)。
watch stop|continue 開(kāi)關(guān)選項(xiàng),設(shè)置遇到讀寫(xiě)斷點(diǎn)時(shí)中斷下來(lái)還是顯示出來(lái)但
是繼續(xù)運(yùn)行。
?
?
[內(nèi)存操作]
?
x /nuf [addr] 顯示線性地址的內(nèi)容
xp /nuf [addr] 顯示物理地址的內(nèi)容
n 顯示的單元數(shù)
u 每個(gè)顯示單元的大小,u可以是下列之一:
b BYTE
h WORD
w DWORD
g DWORD64
注意: 這種命名法是按照GDB習(xí)慣的,而并不是按照inter的規(guī)范。
?
f 顯示格式,f可以是下列之一:
x 按照十六進(jìn)制顯示
d 十進(jìn)制顯示
u 按照無(wú)符號(hào)十進(jìn)制顯示
o 按照八進(jìn)制顯示
t 按照二進(jìn)制顯示
c 按照字符顯示
n、f、u是可選參數(shù),如果不指定,則u默認(rèn)是w,f默認(rèn)是x。如果前面使用過(guò)x或
者xp命令,會(huì)按照上一次的x或者xp命令所使用的值。n默認(rèn)為1。addr 也是一個(gè)
可選參數(shù),如果不指定,addr是0,如過(guò)前面使用過(guò)x或者xp命令,指定了n=i,
則再次執(zhí)行時(shí)n默認(rèn)為i+1。
?
setpmem [addr] [size] [val] 設(shè)置物理內(nèi)存某地址的內(nèi)容。
?
需要注意的是,每次最多只能設(shè)置一個(gè)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
下面的做法都會(huì)導(dǎo)致出錯(cuò):
<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之間數(shù)據(jù)的CRC。
?
?
[寄存器操作]
?
set $reg = val 設(shè)置寄存器的值。現(xiàn)在版本可以設(shè)置的寄存器包括:
eax ecx edx ebx esp ebp esi edi
暫時(shí)不能設(shè)置:
eflags cs ss ds es fs gs
?
r|reg|registers reg = val 同上。
?
dump_cpu 顯示完整的CPU信息。
?
set_cpu 設(shè)置CPU狀態(tài),這里可以設(shè)置dump_cpu所能顯示出來(lái)的
所有CPU狀態(tài)。
?
[反匯編命令]
?
u|disas|disassemble [/num] [start] [end]
反匯編物理地址start到end 之間的代碼,如
果不指定參數(shù)則反匯編當(dāng)前EIP指向的代碼。
num是可選參數(shù),指定處理的代碼量。
set $disassemble_size = 0|16|32 $disassemble_size變量指定反匯編使用的段
大小。
?
set $auto_disassemble = 0|1 $auto_disassemble決定每次執(zhí)行中斷下來(lái)的
時(shí)候(例如遇到斷點(diǎn)、Ctrl-C等)是否反匯
編當(dāng)前指令。
?
[其他命令]
trace-on|trace-off Tracing開(kāi)關(guān)打開(kāi)后,每執(zhí)行一條指令都會(huì)將反匯編的結(jié)果
顯示出來(lái)。
?
ptime 顯示Bochs自本次運(yùn)行以來(lái)執(zhí)行的指令條數(shù)。
?
sb [val] 再執(zhí)行val條指令就中斷。val是64-bit整數(shù),以L結(jié)尾,形
如“1000L”
?
sba [val] 執(zhí)行到Bochs自本次運(yùn)行以來(lái)的第val條指令就中斷。val是
64-bit整數(shù),以L結(jié)尾,形如“1000L”
?
modebp 設(shè)置切換到v86模式時(shí)中斷。
?
record ["filename"] 將輸入的調(diào)試指令記錄到文件中。文件名必須包含引號(hào)。
?
playback ["filename"] 回放record的記錄文件。文件名必須包含引號(hào)。
?
print-stack [num] 顯示堆棧,num默認(rèn)為16,表示打印的條數(shù)。
?
?|calc 和WinDBG的“?”命令類似,計(jì)算表達(dá)式的值。
?
load-symbols [global] filename [offset]
載入符號(hào)文件。如果設(shè)定了“global”關(guān)鍵字,則符號(hào)針
對(duì)所有上下文都有效。offset會(huì)默認(rèn)加到所有的symbol地
址上。symbol文件的格式為:"%x %s"。
?
[info命令]
?
info program 顯示程序執(zhí)行的情況。
info registers|reg|r 顯示寄存器的信息。
info pb|pbreak|b|break 相當(dāng)于blist
info dirty 顯示臟頁(yè)的頁(yè)地址。
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 顯示狀態(tài)寄存器。
info cr 顯示CR系列寄存器。
info symbols 顯示symbol信息。
info ne2k|ne2000 顯示虛擬的 ne2k 網(wǎng)卡信息。 《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
- 上一篇: Bochs调试及相关仿真工具的使用方法
- 下一篇: 使用 Bochs 调试操作系统