WinDbg入門教程 2 各種除錯場景介紹

2021-04-13 12:34:59 字數 2720 閱讀 4486

使用windbg進行遠端除錯是很容易的,而且有很多種可行的方法。在下文中,』除錯伺服器』指的是執行在你所要除錯的遠端機器上的偵錯程式。』除錯客戶端』指的是控制當前會話的偵錯程式。 ·

使用偵錯程式:你需要cdb, ntsd或者windbg已經安裝在遠端機器上。windbg客戶端可以連線到cdb, ntsd或者windbg中的任何乙個作為伺服器,反之亦然。在客戶端和伺服器直接可以選擇tcp或者命名管道作為通訊協議。 o

在伺服器端的啟動過程: §

windbg –server npipe:pipe=pipename(注:可以允許多個客戶端連或 §

從windbg內部:

.server npipe:pipe=pipename(注,連線單個客戶端)

你可以用多種協議開啟不同的服務會話。並且可用密碼來保護乙個會話。 o

從客戶端連線: §

windbg -remote npipe:server=server, pipe=pipename[,password=password]

§從windbg內部:

file->connect to remote session: for connection string, enter npipe:server=server, pipe=pipename [,password=password]

·使用remote.exe:remote.exe使用命名管道作為通訊的方式。如果你使用的是乙個命令列介面的程式,比如kd,cdb或者ntsd。你可以使用remote.exe來遠端除錯。注意:使用@q(不是q)來退出客戶端,不用關掉服務端。 o

要啟動乙個服務端: §

remote.exe /s 「cdp –p 」 test1

o從客戶端連線: §

remote.exe /c test1

上面的test1是我們所選擇的命名管道的名字。

服務端會顯示那個客戶端從那個伺服器連線以及執行過的命令。你可以使用『qq』命令來退出服務端;或者使用file->exit來退出客戶端。另外,如果要進行遠端除錯,你必須屬於遠端機器的」debugger user」組並且伺服器必須允許遠端連線。

在windbg的文件的」enabling postmorten debugging」部分對此有很詳細的討論。簡而言之,你可以把windbg設定成預設的即時偵錯程式,命令就是:windbg –i

。這個命令實際上是把登錄檔中

hklm/software/microsoft/windows nt/currentversion/aedebug的鍵值設定成windbg。如果要把windbg設定成為預設的託管偵錯程式,你需要顯示設定如下的登錄檔鍵值:

通過jit的設定,當乙個應用程式在不是除錯的狀態下丟擲了未處理的異常之時,windbg就會被啟動。

所有這些偵錯程式均支援在amd64和ia64上的64位除錯環境。

windbg 6.3以後的版本支援在widbey(vs2005和.net 2.0的內部開發代號) .net clr託管除錯。在文件中針對託管除錯有很好的討論。需要注意的是,對於託管程式來說,沒有剛才所說的pdb(譯註:託管**實際上也是有

pdb的,但是這個pdb

實際上記錄了c#

**和il

**的對應關係以及相關的一些資訊

)的概念,因為所有的程式都是編譯成為ila**。偵錯程式通過clr來查詢所需的附加資訊。

有幾點需要注意:

你只能在託段函式的**被執行過至少一次之後才能設定斷點。只有這樣它才能被編譯成彙編**。記住以下的幾點: ·

oclr有可能丟棄已經編譯好的**,所以函式的入口位址有可能改變。 o

同樣的**有可能被多次編譯,如果多個應用程式域沒有共享這段**的話。如果你設定了乙個斷點,它就會被設定在當前執行緒(譯註:clr

的邏輯執行緒

)所在的應用程式域內。 o

泛型的特殊例項可能導致同乙個函式有不同的位址。.

·資料儲存布局的複雜化以及對應的資料檢查:

·偵錯程式命令的複雜化 o

當跟蹤託管**的時候,你會需要穿越大段的clr自己的**比如jit編譯器的**,原因可能是你第一次進入乙個函式,或者是你在託管和非託管**之間進行切換。

使用windbg,你可以像除錯其它應用程式那樣除錯windows服務程式。即可以通過附加程序的方法啟動windows服務,也可以把windbg當作乙個即時偵錯程式,並且在**中呼叫dbgbreakpoint或者

debugbreak,或者在x86機器上加入一條int 3彙編指令。

乙個偵錯程式會得到兩次的異常通知-第一次在應用程式有機會處理異常之前(『first chance exception』);如果應用程式沒有處理這個異常,這時候偵錯程式就會有機會來處理異常(『second-chance exception』)。如果偵錯程式沒有處理二次機會的異常,應用程式就會退出。

.lastevent

或者,!analyze –v

命令會給你顯示異常的記錄以及異常丟擲所在函式的堆疊跟蹤資訊。

你也可以使用

.exr, .cxr

以及.ecxr

命令來顯示異常和上下文記錄。同時需要注意的是,你也可以改變first-chance的處理選項。對應的命令就是:

sxe, sxd, sxn

和sxi。

源位址

windbg入門教程(1)-偵錯程式的基礎知識

QML入門教程 2

qml入門教程 2 qml元件 cell.qml的內容import qt 4.7 item mousearea 挨個看 item 這一部分沒有特別好說的,在item中內嵌了乙個id為rectangle白邊框的矩形區域,大小佔滿整個item。mousearea mousearea則為item增加了一塊...

QML入門教程 2

import qt 4.7 item mousearea 挨個看 item這一部分沒有特別好說的,在item中內嵌了乙個id為rectangle白邊框的矩形區域,大小佔滿整個item。mouseareamousearea則為item增加了一塊滑鼠響應區,看它的anchors知道,在整個item區域內...

Python入門教程(2)

python 英語發音 pa n 是一種物件導向 解釋型計算機程式語言,由guido van rossum於1989年底發明,第乙個公開發行版發行於1991年,python 源 同樣遵循 gpl gnu general public license 協議。python語法簡潔而清晰,具有豐富和強大的...