天天看點

bochs調試方法與指令詳解

bochs調試FAQ:

一 基本調試指令

1.       Q:如何從引導扇區開始設定斷點?

A: BIOS被載入記憶體中運作,其引導扇區的位址一般都是在0x7c00,因為在實模式下,​​邏輯位址​​和實體位址是一一對應的, 是以我們可以在啟動bochs調試的​​指令行​​下輸入

        pb 0x7c00 或者 vb 0:0x7c00

就着輸入

        c

bochs就會在0x7c00處停下 

2.       Q: 我想在單步執行(s)後看到寄存器的變化情況, 該怎麼設定?

A: 輸入

               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指令

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資訊。

繼續閱讀