1. 程式人生 > 其它 >bochs偵錯程式基本命令

bochs偵錯程式基本命令

一 基本除錯命令

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

info ne2k|ne2000顯示虛擬的ne2k網絡卡資訊。