debug

排除程序故障

DEBUG是一種計算機程序。馬克2號(Harvard Mark II)編製程序的葛麗絲·霍波(Grace Hopper)是一位美國海軍准將及計算機科學家,同時也是世界最早的一批程序設計師之一。有一天,她在調試設備時出現故障,拆開繼電器后,發現有隻飛蛾被夾扁在觸點中間,從而“卡”住了機器的運行。於是,霍波詼諧的把程序故障統稱為“臭蟲(BUG)”,把排除程序故障叫DEBUG,而這奇怪的“稱呼”,竟成為後來計算機領域的專業行話。如DOS系統中的調試程序,程序名稱就叫DEBUG。DEBUG在windows系統中也是極其重要的編譯操作。

概念


1937年,美國青年霍華德·艾肯找到IBM公司為其投資200萬美元研製計算機,第一台成品艾肯把它取名為:馬克1號(mark1),又叫“自動序列受控計算機”,從這時起IBM公司由生產製表機,肉鋪磅秤,咖啡研磨機等亂七八糟玩意兒行業,正式跨進“計算機”領地。

有力偵錯


DOS中的Debug
是為DOS提供的有力的偵錯,跟蹤程序運行,檢查系統數據的工具程序,它是在字元界面下以單字元命令方式工作。要很好地使用它必須具備一定的彙編程序設計和硬體基本知識的能力,當然,它為彙編語言程序員提供了有效的調試手段,它的功能包括以下幾個方面。
1.直接輸入、更改、跟蹤、運行彙編程序;
2.觀察操作系統的內容;
3.查看ROM BIOS的內容;
4.觀察更改RAM內部的設置值;
5.以扇區或文件的方式讀寫軟盤數據。
在DEBUG中地址用段地址與段內地址來表示,而段地址可以明確地指出來,也可以用一個段指示器(段寄存器)來代表,用段寄存器表示時,其段地址就是此寄存器的內含值:
如:用段地址和段內地址表示FOFF:0100
用段寄存器和段內地址表示CSF:0100←CS指向F000
下面列出了常用命令用法。
-A地址從指定地址開始編寫小彙編程序,按兩個回車鍵結束編輯
-U地址從指定地址開始反彙編32位元組的機器指令,預設地址則從上一U命令繼續
-D始址終址以16進位/Asc字元對照方式顯示指定內存範圍的數據,每行顯示10H個位元組
-E地址值表用給出的值表(空格分隔)替換指定地址開始的內存單元,例:-E 100 'v' 1F 'hello'
-N文件名為後續的L/W命令約定所操作的文件名
-L地址將N命令所指定文件的內容讀入到指定內存位置。另,邏輯卷扇區直接讀:-L地址邏卷號起始邏扇號扇數
-W地址將BX-CX個位元組的內存數據寫入N命令指定的文件中。另,邏輯卷扇區直接寫:-W地址邏卷號起始邏扇號扇數
-R寄存器名顯示並允許修改指定寄存器的值
-G=始址終址執行指定內存中的機器指令程序
-T=地址單步執行機器指令,預設地址則從上一T命令繼續。另,繼續跟蹤m條指令:-Tm
例如:讀取c:卷的引導扇區,並保存到Boot.1文件中,並簡單分析引導程序的前面幾條指令:
-L1000 2 0 1
-N boot.1
-R bx ;輸入0000
-R cx ;輸入0200
-W 1000
-U 1000
例如:讀取第一個硬碟上的主引導扇區,並保存到MB.1文件中,在屏幕上顯示硬碟分區表數據:
-A 100
yyyy:0100 mov dx,0080
yyyy:01xx mov cx,0001
yyyy:01xx mov ax,yyyy
yyyy:01xx mov es,ax
yyyy:01xx mov bx,1000
yyyy:01xx mov ax,0201
yyyy:01xx int 13
yyyy:01zz nop
-G=yyyy:0100 01zz
-N mb.1
-R bx ;輸入0000
-R cx ;輸入0200
-W 1000
-D 11be 11ff

程序命令


獲得路由器中交換的報文和幀的細節信息
用於調試信息
debugging命令使用注意事項
不使用debug命令監控正常的網路運行
在網路使用的低峰期使用
不要輕易使用類似debugging all之類的命令
使用debugging命令后,應立即以“undo debugging”命令終止debugging命令的執行。
Debugger
"Debugger"這個詞按它的英文字面意思來講是這樣一種“裝置”(-er),這種裝置可以“消除”(De-)“系統中的缺陷”(bug)。然而事實上,迄今為止我們經常使用到的"Debugger"只是用來幫助我們進行Debug的工具,"Debugger"本身不能自動完成"Debug"。我們可以回想一下我們是如何進行Debug的,在進行Debug的過程中,我們通過Debugger來完成以下工作:
(1)監視“Debug對象”的狀態;
(2)控制“Debug對象”的運行;
這些工作可以為“發現Debug對象中存在的問題”以及“對解決問題方案的檢驗”提供有用的信息。
監控工作有時只需要由軟體就可以完成,有時不僅需要軟體支持,還需要硬體的支持。
Debugger除了被用來Debug,還被用來幫助我們理解“Debug的對象”內部結構,因為我們用到的Debugger能夠完成對“Debug對象”的監控工作,在監控的過程中可以獲取“Debug對象”動態特徵的信息,這對我們理解其結構是非常有用的。
關於更詳細的介紹和研究可以參考國人原創的《軟體調試》,這是一本非常全面且深入的“軟體調試”紅皮書。
WinDbg是微軟發布的一款相當優秀的源碼級(source-level)調試工具,可以用於Kernel模式調試和用戶模式調試,還可以調試Dump文件。
DEBUG 2
Debug
啟動 Debug,它是可用於測試和調試 MS-DOS可執行文件的程序。
Debug [[drive:][path] filename [parameters]]
參數
[drive:][path] filename
指定要測試的可執行文件的位置和名稱。
parameters
指定要測試的可執行文件所需要的任何命令行信息。
說明:使用 Debug 命令但不指定要測試的文件
如果使用沒有位置和文件名的 Debug 命令,然後鍵入所有的 Debug 命令以響應 Debug 提示符,連字元(-)。
DOS中Debug 命令
以下是 Debug 子命令列表,
?顯示 Debug 詳細命令列表。
Debug:A(彙編)—彙編8086/8087/8088記憶碼
Debug:C(比較)—比較內存的兩個部分
Debug:D(轉儲)—顯示部分內存的內容
Debug:E(鍵入)—從指定地址開始,將數據輸入到內存
Debug:F(填充)—使用指定值填充一段內存
Debug:G(轉向)—運行在內存中的可執行文件
Debug:H(十六進位)—執行十六進位運算
Debug:I(輸入)—顯示來自特定埠的1位元組值
Debug:L(載入)—將文件或磁碟扇區內容載入到內存
Debug:M(移動)—複製內存塊中的內容
Debug:N(名稱)—為l或w命令指定文件,或者指定正在測試的文件的參數
Debug:O(輸出)—向輸出埠發送1個位元組的值
Debug:P(執行)—執行循環、重複的字元串指令、軟體中斷或子常式
Debug:Q(退出)—停止Debug會話
Debug:r(寄存器)—顯示或改變一個或多個寄存器
Debug:s(搜索)—在部分內存中搜索一個或多個位元組值的模式
Debug:T(跟蹤)—執行一條指令,然後顯示所有寄存器的內容、所有標誌的狀態和Debug下一步要
執行的指令的解碼形式
Debug:U(反彙編)—反彙編位元組並顯示相應的原語句
Debug:W(寫入)—將被測試文件寫入磁碟
Debug:XA(分配擴展內存)
Debug:XD(取消分配擴展內存)
Debug:XM(映射擴展內存頁)
Debug:XS(顯示擴展內存狀態)
分隔命令參數:
所有Debug命令都接受參數,除了q命令之外。可以用逗號或空格分隔參數,但是只有在兩個十六進位值之間才需要這些分隔符。因此,以下命令等價:
dcs:100 110
d cs:100 110
d,cs:100,110
指定有效地址項:
Debug命令中的address參數指定內存位置。Address 是一個包含字母段記錄的二位名稱或一個四位欄位地址加上一個偏移量。可以忽略段寄存器或段地址。a,g,l,t,u和w命令的默認段是CS。所有其他命令的默認段是DS。所有數值均為十六進位格式。
有效地址如下:
CS:0100
04BA:0100
在段名和偏移量之間要有冒號。
指定有效範圍項:
Debug命令中的range參數指定了內存的範圍。可以為range選擇兩種格式:起始地址和結束地址,或者起始地址和長度範圍(由l表示)。
例如,下面的兩個語法都可以指定從CS:100開始的16位元組範圍:
cs:100 10f
cs:100 l 10
子命令Debug A
作用:直接將8086/8087/8088記憶碼合併到內存。
該命令從彙編語言語句創建可執行的機器碼。所有數值都是十六進位格式,必須按一到四個字元輸入這些數值。在引用的操作代碼(操作碼)前指定前綴記憶碼。
格式:A[address]
參數:
address
指定鍵入彙編語言指令的位置。對address使用十六進位值,並鍵入不以“h”字元結尾的每個值。如果不指定地址,a將在它上次停止處開始彙編。
有關將數據輸入到指定位元組中的信息,請單擊“相關主題”列表中的Debug E(鍵入)。
有關反彙編位元組的信息,請單擊“相關主題”列表中的Debug U(反彙編)。
範例:
a命令支持所有形式的間接註冊命令,如下例所示:
add bx,34.[si-1]
pop
push [si] )
還支持所有操作碼同義詞,如下例所示:
loopz 100
loope 100
ja 200
jnbe 200
對於 8087操作碼,必須指定 wait 或 fwait 前綴,如下例所示:
fwait fadd st,st(3) ; this line assembles
; an fwait prefix
說明:
使用記憶碼
段的替代記憶碼為 cs:、ds:、es: 和 ss:。遠程返回的記憶碼是 retf。字元串處理的記憶碼必須明確聲明字元串大小。例如,使用 movsw 可以移動 16 位的字串,使用 movsb 可以移動 8 位位元組串。
彙編跳轉
彙編程序根據位元組替換自動將短、近和遠的跳轉及調用彙編到目標地址。通過使用 near 或 far 前綴可以替代這樣的跳轉或調用,如下例所示:
-a0100:0500
0100:0500 jmp 502 ; a 2-byte short jump
0100:0502 jmp near 505 ; a 3-byte near jump
0100:0505 jmp far 50a ; a 5-byte far jump
可以將 near 前綴縮寫為 ne。
區分字和位元組內存位置
當某個操作數可以引用某個字內存位置或者位元組內存位置時,必須用前綴 word ptr 或者前綴 byte ptr 指定數據類型。可接受的縮寫分別是 wo 和 by。以下範例顯示兩種格式:
dec wo [si]
neg byte ptr [128]
指定操作數
Debug 使用包括在中括弧 ([ ]) 的操作數引用內存地址的習慣用法。這是因為另一方面 Debug 不能區分立即操作數和內存地址的操作數。以下範例顯示兩種格式:
mov ax,21 ; load AX with 21h
mov ax,[21] ; load AX with the
; contents of
; memory location 21h
使用偽指令
使用 a 命令提供兩個常用的偽指令:db操作碼,將位元組值直接彙編到內存,dw 操作碼,將字值直接彙編到內存。以下是兩個偽指令的範例:
db 1,2,3,4,"THIS IS AN EXAMPLE"
db THIS IS A QUOTATION MARK:"
db "THIS IS A QUOTATION MARK:"
dw 1000,2000,3000,"BACH"
子命令 Debug:C(比較)
作用:比較內存的兩個部分。
格式: C range address
參數1: range
指定要比較的內存第一個區域的起始和結束地址,或起始地址和長度。有關有效的 range 值的信息,請單擊“相關主題”列表中的“Debug 說明”。
參數2:address
指定要比較的第二個內存區域的起始地址。有關有效 address 值的信息,請單擊“相關主題”列表中的“Debug 說明”。
範例:
以下命令具有相同效果:
c100,10f 300
c100l10 300
每個命令都對 100h 到 10Fh 的內存數據塊與 300h 到 30Fh 的內存數據塊進行比較。
Debug 響應前面的命令並顯示如下信息(假定 DS = 197F):
197F:0100 4D E4 197F:0300
197F:0101 67 99 197F:0301
197F:0102 A3 27 197F:0302
197F:0103 35 F3 197F:0303
197F:0104 97 BD 197F:0304
197F:0105 04 35 197F:0305
197F:0107 76 71 197F:0307
197F:0108 E6 11 197F:0308
197F:0109 19 2C 197F:0309
197F:010A 80 0A 197F:030A
197F:010B 36 7F 197F:030B
197F:010C BE 22 197F:030C
197F:010D 83 93 197F:030D
197F:010E 49 77 197F:030E
197F:010F 4F 8A 197F:030F
注意列表中缺少地址 197F:0106 和 197F:0306。這表明那些地址中的值是相同的。
說明:
如果 range 和 address 內存區域相同,Debug 將不顯示任何內容而直接返回到 Debug 提示符。如果有差異,Debug 將按如下格式顯示:
address1 byte1 byte2 addess2
子命令Debug
作用:顯示一定範圍內存地址的內容。
格式:d [range]
參數:range
指定要顯示其內容的內存區域的起始和結束地址,或起始地址和長度。有關有效的 range 值的信息,請單擊“相關主題”列表中的“Debug 說明”。如果不指定 range,Debug 程序將從以前 d 命令中所指定的地址範圍的末尾開始顯示 128 個位元組的內容。
有關顯示寄存器內容的信息,請單擊“相關主題”列表中的 Debug R(寄存器)。
範例:
假定鍵入以下命令:
D cs:100 10f
Debug 按以下格式顯示範圍中的內容:
04BA:0100 54 4F 4D 00 53 41 57 59-45 52 00 00 00 00 00 00 TOM.SAWYER......
如果在沒有參數的情況下鍵入 d 命令,Debug 按以前範例中所描述的內容來編排顯示格式。顯示的每行以比前一行的地址大 16 個位元組(如果是顯示 40 列的屏幕,則為 8 個位元組)的地址開頭。
對於後面鍵入的每個不帶參數的 d 命令,Debug 將緊接在最後顯示的命令后立即顯示位元組內容。
例如:如果鍵入以下命令,Debug 將從 CS:100 開始顯示 20h 個位元組的內容:
D cs:100 L 20 (range參數為:起始地址和長度)
例如:如果鍵入以下命令,Debug 將顯示範圍從 CS 段的 100h 到 115h 中所有位元組的內容:
D cs:100 115 (range參數為:起始地址和結束地址)
說明:
當使用 d 命令時,Debug 以兩個部分顯示內存內容:十六進位部分(每個位元組的值都用十六進位格式表示)和 ASCII 碼部分(每個位元組的值都用 ASCII 碼字元表示)。每個非列印字元在顯示的 ASCII 部分由句號 (.) 表示。每個顯示行顯示 16 位元組的內容,第 8 位元組和第 9 位元組之間有一個連字元。每個顯示行從 16 位元組的邊界上開始。
子命令Debug E
作用:將數據輸入到內存中指定的地址。
可以按十六進位或 ASCII 格式鍵入數據。以前存儲在指定位置的任何數據全部丟失。
格式:E address [ list ]
參數1:address
指定輸入數據的第一個內存位置。
參數2: list
指定要輸入到內存的連續位元組中的數據。
有關集成記憶碼的信息,請單擊“相關主題”列表中的 Debug A(彙編)。
有關顯示內存部分內容的信息,請單擊“相關主題”列表中的 Debug D (轉儲)。
範例:
假定鍵入以下命令:
E cs:100
Debug 按下面的格式顯示第一個位元組的內容:
04BA:0100 EB.
要將該值更改為 41,請在插入點鍵入 41,如下所示:
04BA:0100 EB.41_
可以用一個 e 命令鍵入連續的位元組值。在鍵入新值后按 SPACEBAR(空格鍵),而不是按 ENTER 鍵。Debug 顯示下一個值。在此範例中,如果按三次 SPACEBAR(空格鍵),Debug 將顯示下面的值:
04BA:0100 EB.41 10. 00. BC._
要將十六進位值 BC 更改為 42,請在插入點鍵入 42,如下所示:
04BA:0100 EB.41 10. 00. BC.42_
假定決定值 10 應該是 6F。要糾正該值,請按 HYPHEN(減號鍵)兩次以返回到地址 0101(值 10)。Debug 顯示以下內容:
04BA:0100 EB.41 10. 00. BC.42-
04BA:0102 00.-
04BA:0101 10._
在插入點鍵入 6f 更改值,如下所示:
04BA:0101 10.6f_
按 ENTER 停止 e 命令並返回到 Debug 提示符下。
以下是字元串項的範例:
E ds:100 ‘This is the text example’
該字元串將從 DS:100 開始填充 24 個位元組。
說明:
使用address 參數
如果在沒有指定可選的 list 參數的值情況下指定 address 的值,Debug 將顯示地址和內容,在下一行重複地址,並等待您的輸入。此時,您可以執行下列操作之一:
· 替換位元組值。為此,請在當前值后鍵入新值。如果您鍵入的值不是有效的十六進位值,或該值包含兩個以上的數字,則 Debug 不會回顯無效或額外的字元。
· 進入下一個位元組。為此,請按 SPACEBAR(空格鍵)。要更改該位元組中的值,請在當前值后鍵入新值。如果按 SPACEBAR(空格鍵)時,移動超過了 8 位界限,Debug 程序將顯示新的一行並在行首顯示新地址。
· 返回到前一個位元組。為此,請按 HYPHEN 鍵 (-)。可以反覆按 HYPHEN 鍵 (-) 向後移動超過多個位元組。在按 HYPHEN 時,Debug 開始新行並顯示當前地址和位元組值。
· 停止執行 e 命令。為此,請按 ENTER 鍵。在任何位元組位置都可以按 ENTER。
使用 list 參數
如果指定 list 參數的值,隨後的 e 命令將使用列表中的值替換現有的位元組值。如果發生錯誤,將不更改任何位元組值。
List 值可以是十六進位位元組或字元串。使用空格、逗號或製表符來分隔值。必須將字元串包括在單或雙引號中。
子命令 Debug F
作用:使用指定的值填充指定內存區域中的地址。
可以指定十六進位或 ASCII 格式表示的數據。任何以前存儲在指定位置的數據將會丟失。
格式: F range list
參數1:range
指定要填充內存區域的起始和結束地址,或起始地址和長度(用字母L 加16進位數字)。關於有效的 range 值的信息,請單擊“相關主題”列表中的“Debug 說明”。
參數2:list
指定要輸入的數據。List 可以由十六進位數或引號包括起來的字元串組成。
範例:
假定鍵入以下命令:
-F 04ba:100 L 100 42 45 52 54 41 (range參數:起始地址和長度,list參數:52 45 52 54 41)
作為響應,Debug 使用指定的值填充從 04BA:100 到 04BA:1FF 的內存位置。Debug 重複這五個值直到 100h 個位元組全部填滿為止。
說明:
range參數
如果 range 包含的位元組數比 list 中的數值大,Debug 將在 list 中反覆指派值,直到 range 中的所有位元組全部填充。
如果在 range 中的任何內存損壞或不存在,Debug 將顯示錯誤消息並停止 f 命令。
list 參數
如果 list 包含的數值多於 range 中的位元組數,Debug 將忽略 list 中額外的值。
子命令 Debug G
作用:運行當前在內存中的程序。
格式:G [=address] [addresses]
參數:
=address
指定當前在內存中要開始執行的程序地址。如果不指定 address,Windows 2000 將從 CS:IP寄存器中的當前地址開始執行程序。
breakpoints
指定可以設置為 g 命令的部分的 1 到 10 個臨時斷點。
有關執行循環、重複的字元串指令、軟體中斷或子程序的信息,請單擊“相關主題”列表中的 Debug P(執行)。
有關執行指令的信息,請單擊“相關主題”列表中的 Debug T(跟蹤)。
範例:
假定鍵入以下命令:
-G cs:7550
Windows 2000 運行當前內存中的程序,直到執行到 CS 段中的斷點地址 7550 為止。Debug 將顯示寄存器的內容和標誌的狀態並結束 g 命令。
以下命令設置兩個斷點:
G cs:7550, cs:8000
如果在 Debug 遇到斷點之後再次鍵入 g 命令,將從在斷點之後的指令開始執行,而不是在通常的開始地址執行。
說明:
-使用 address 參數
必須在 address 參數之前使用等號 (=) 以區分開始地址 (address) 和斷點地址 (breakpoints)。
-指定斷點
程序在它遇到的第一個斷點處停止,而不論您在 breakpoint 列表的什麼位置鍵入斷點。Debug 在每個斷點處用中斷代碼代替原始指令。
當程序到達斷點時,Debug 將所有斷點地址恢復到它們的最初指令並顯示所有寄存器的內容、所有標記的狀態以及最後執行指令的解碼形式。Debug 顯示的信息與使用 Debug r(寄存器)命令並指定斷點時所顯示的信息相同。
如果不在斷點處停止程序,Debug 程序將不使用原始指令替換中斷代碼。
-設置斷點的限制
可以只在包含 8086 操作代碼(操作碼)的第一個位元組的地址上設置斷點。如果設置了 10 個以上的斷點,Debug 將顯示以下信息:
bp error
-對用戶堆棧指針的要求
用戶堆棧指針必須有效且必須有 6 個位元組可用於 g 命令。該命令使用iret指令跳轉到正在被測試的程序。Debug 設置用戶堆棧指針並將用戶標誌、代碼段寄存器和指令指針壓入用戶堆棧。(如果用戶堆棧無效或太小,操作系統可能會失敗。)Debug 在指定的斷點處設置中斷代碼 (0CCh)。
-重新啟動程序
不要在 Windows 2000 顯示以下消息后嘗試重新啟動程序;
Program terminated normally
要正確地運行程序,必須通過使用 Debug n(名稱)和 l(載入)命令重新載入該程序。
子命令 Debug:H(十六進位)
作用:對指定的兩個參數執行十六進位運算。
格式: H value1 value2
參數:value1代表從 0 到 FFFFh 範圍內的任何十六進位數字。
value2代表從 0 到 FFFFh 範圍內第二個十六進位數字。
範例:假定鍵入以下命令:-H19f 10a
Debug 執行運算並顯示以下結果。 02A9 0095
說明:
Debug 首先將指定的兩個參數相加,然後從第一個參數中減去第二個參數。這些計算的結果顯示在一行中:先計算和,然後計算差。
子命令Debug:I(輸入)
作用:從指定的埠讀取並顯示一個位元組值。
格式: I port
參數:port 按地址指定輸入埠。地址可以是 16 位的值。
有關將位元組值發送到輸出埠的信息,請單擊“相關主題”列表中的 Debug O(輸出)。
範例:假定鍵入以下命令:-i 2f8
Debug 讀取該位元組,並將其值顯示如下:42 (同時假定埠的位元組值是 42h。)
子命令Debug L
作用:將某個文件或特定磁碟扇區的內容載入到內存。
要從磁碟文件載入 BX:CX寄存器中指定的位元組數內容,請使用以下語法:
格式: L [address] [drive] [firstsector] [number]
要略過 Windows 2000 文件系統並直接載入特定的扇區,請使用以下語法:
l address drive start number
參數:
address
指定要在其中載入文件或扇區內容的內存位置。如果不指定 address,Debug 將使用 CS寄存器中的當前地址。
drive
指定包含讀取指定扇區的磁碟的驅動器。該值是數值型:0 = A, 1 = B, 2 = C 等。
start
指定要載入其內容的第一個扇區的十六進位數。
number
指定要載入其內容的連續扇區的十六進位數。只有要載入特定扇區的內容而不是載入 debug 命令行或最近的 Debug n(名稱)命令中指定的文件時,才能使用 drive、start 和 number 參數。
有關指定用於 l 命令的文件的信息,請單擊“相關主題”列表中的 Debug n(名稱)。
有關寫入調試到磁碟的文件的信息,請單擊“相關主題”列表中的 Debug w(寫入)。
範例:
假定啟動 Debug 並鍵入以下命令:
現在可以鍵入 l 命令以載入 File。com。Debug 將載入文件並顯示 Debug 提示符。
假定需要從驅動器C 將起始邏輯扇區為 15 (0Fh) 的 109 (6Dh) 個扇區的內容載入到起始地址為 04BA:0100 的內存中。為此,請鍵入以下命令:
-L 04ba:100 2 0f 6d
注意:
-使用不帶參數的 l 命令
當使用不帶參數的 l 命令時,在 debug 命令行上指定的文件將載入到內存中,從地址 CS:100 開始。Debug 同時將 BX 和 CX寄存器設置為載入的位元組數。如果不在 debug 命令行指定文件,所裝入的文件將是最近使用 n 命令經常指定的文件。
-使用具有 address 參數的 l 命令
如果使用帶 address 參數的 l 命令,Debug 將從內存位置 address 開始載入文件或指定扇區的內容。
-使用帶全部參數的 l 命令
如果使用帶所有參數的 l 命令,Debug 將載入指定磁碟扇區的內容而不是載入文件。
-載入特定扇區的內容
指定範圍內的每個扇區均從 drive 讀取。Debug 從 start 開始載入,直到在 number 中指定的扇區數中的內容全部被載入。
-載入文件
Debug 忽略 .exe 文件的地址 address 參數。如果指定 .exe 文件,Debug 將文件重新定位到 .exe 文件的標題中指定的載入地址。在 .exe 文件被載入到內存前,標題自身從 .exe 文件脫離,因此磁碟上的 .exe 文件大小與內存中的不同。如果要檢查整個 .exe 文件,請使用不同的擴展名重命名文件。
-打開十六進位文件
Debug 將具有 .hex 擴展名的文件認為十六進位格式文件。鍵入不帶參數的 l 命令,可以載入從十六進位文件中指定的地址處開始的十六進位文件。如果鍵入的 l 命令包含 address 參數,Debug 將把指定的地址加到在十六進位文件中找到的地址上,以確定起始地址。
子命令 Debug M
作用:將一個內存塊中的內容複製到另一個內存塊中。
格式: m range address
參數:
range
指定要複製內容的內存區域的起始和結束地址,或起始地址和長度。
address
指定要將 range 內容複製到該位置的起始地址。
範例:
假定鍵入以下命令:
mcs:100 110 cs:500
Debug 首先將 CS:110 地址中的內容複製到地址 CS:510 中,然後將 CS:10F 地址中的內容複製到 CS:50F 中,如此操作直至將 CS:100 地址中的內容複製到地址 CS:500 中。要查看結果,請使用 Debug d(轉儲)命令,並使用 m 命令指定目標地址。
說明:
複製操作對現有數據的影響
如果新數據沒有寫入正在被複制的數據塊中的地址,則源數據將保持不變。但是,如果目標塊已經包含數據(就象它在覆蓋副本操作中一樣),則將改寫該數據。(覆蓋複製操作是指那些目標數據塊部分內容覆蓋原數據塊部分內容的操作。)
執行覆蓋複製操作
m 命令執行目標地址的覆蓋複製操作,而不丟失數據。將改寫的地址內容首先複製。因此,如果將較高位地址的數據複製到較低位地址,則複製操作從原塊的最低位地址開始並向最高位地址進行。反之,如果要將數據從低地址複製到高地址,複製操作從原塊的最高地址開始,向最低地址進行。
子命令 Debug N
作用: 指定 Debug l(載入)或 w(寫入)命令的可執行文件的名稱,或者指定正在調試的可執行文件的參數。
格式:n [drive:][path] filename
參考:
1. WinDbg介紹:
Debugging Tools and Symbols: Getting Started
A word for WinDbg
2. WinDbg下載:
Install Debugging Tools for Windows 32-bit Version
Install Debugging Tools for Windows 64-bit Versions

調試


PHP Debug
PHP的調試方法最基本的是echo或者var_dump。還有就是使用zend debug 或者Xdebug的調試插件。
echovar_dump調試
echovar_dump這樣的調試方法最近本也最常用,而且相對來說小點的項目也沒有必要使用調試插件。這裡就不做介紹了。
zend debug調試
zend debug鄙人使用的少,這裡稍微提一下,有需要的請自己查詢相關信息。
這裡是zend debug的官網以及下載地址:
Xdebug 調試
採用Xdebug進行調試,官網以及下載地址配置如下:
[Xdebug]
zend_extension=D:\wamp\bin\php\php5.3.3\ext\php_xdebug-2.1.0-5.3-vc6.dll
;允許調試的客戶端IP
xdebug.remote_host=192.168.1.107
;遠程調試的埠(默認9000)
xdebug.remote_port=9000
;調試插件dbgp
xdebug.remote_handler=dbgp
詳細配置請參閱:
工具調試
最後給大家介紹一個小工具Eclipse Console for PHP(EC4P)下載地址:
我們有時候需要echo 或var_dump,但是發現直接在網頁上輸出調試信息的方法又不起作用,或者起到反作用。比 如A頁面調用B頁面需B返回信息而非轉向到B時,在B加入echo調試永遠不能得到正確的結果。所以我們需要使用IDE比如Eclipse輸出內容,很遺憾,PHP並不能輸出到控制台,至少我是這麼認為的。這時候就需要想辦法了。
我在網上找到這個工具,同時這個工具很好的實現了我們的需求,同時實現了輸出定位,可以很容易找到問題。
我們可以在網上搜“PHP開發調試(debug)工具Eclipse Console for PHP(EC4P)”,或者直在sourceforge里搜“econsole4php”。

原則


你改錯了文件
你改對了文件,但卻是在別人的機器上
你改對了文件,但忘了保存
你改對了文件,但忘了重新編譯
你認為你把那個東西開啟了,但實際上你把它關閉了
你認為你把那個東西關閉了,但實際上你把它開啟了
會議中,你應該用心聽。
你運行了錯誤的版本
你運行了正確的版本,但卻是在別人的機器上
你改正了問題,但忘了提交
你改正了問題,也提交了,但忘了 push 到版本庫中
你改正了問題,也提交了,也 push 了。然而,很多用戶的工作都依賴於之前有問題的版本,於是你必須回滾。