bochs調試方法與指令詳解

注意:調試版的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命令

 

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

相關文章
相關標籤/搜索