1. 程式人生 > >windbg學習進階之——dump分析常用命令收集

windbg學習進階之——dump分析常用命令收集

#重要說明

(1) windbg命令分為標準命令,元命令和擴充套件命令

     標準命令提供最基本的除錯功能,不區分大小寫。如:bp  g  dt  dv  k等

     元命令提供標準命令沒有提供的功能,也內建在除錯引擎中,以.開頭。如.sympath  .reload等

     擴充套件命令用於擴充套件某一方面的除錯功能,實現在動態載入的擴充套件模組中,以!開頭。如!analyze等

(2) 進入除錯狀態時,直接回車可重複執行上一條命令;按上下方向鍵可以瀏覽和選擇以前輸入過的命令

(3) 神奇的Tab鍵,進行命令補全;ESC清除當前命令輸入框中的文字

(4) 使用;作為分隔符,可以在同一行輸入多條命令

(5) 上圖紅色框中的“0:000”。【0為當前除錯會話的程序號;000為除錯會話的執行緒號

(6) 當命令提示符顯示*BUSY*時,即使命令輸入框可以輸入命令,但輸入的命令不會立即被執行,要等windbg空閒時才能執行。

     可使用Ctrl + Break來終止一個長時間未完成的命令

#程序與執行緒

| // 列出除錯程序

|* // 列出除錯程序

|N // 參看序數為N的除錯程序

|Ns // 切換序數為N的程序為當前除錯程序

~ // 列出執行緒

~* // 所有執行緒

~* k // 所有執行緒堆疊資訊

~* r // 所有執行緒暫存器資訊

~. // 檢視當前執行緒

~# // 檢視導致當前事件或異常的執行緒

~N // 檢視序數為N的執行緒

~~[n] // 檢視執行緒ID為n的執行緒

~Ns // 切換序數為N的執行緒為當前除錯執行緒

~N f // 凍結序數為N的執行緒

~N u // 解凍序數為N的執行緒

~N n // Suspend序數為N的執行緒

~N m // Resume序數為N的執行緒

#呼叫堆疊

k // 顯示當前呼叫堆疊

kn // 帶棧編號顯示當前呼叫堆疊

kb // 打印出前3個函式引數的當前呼叫堆疊

kb 5 // 只顯示最上的5層呼叫堆疊

.frame // 顯示當前棧幀

.frame n // 設定編號n的棧幀為當前棧幀

.frame /r n // 設定編號n的棧幀為當前棧幀 並顯示暫存器變數

!uniqstack // 顯示所有執行緒的呼叫堆疊

#啟動除錯

windbg "notepad.exe" arguments // 使用windbg啟動除錯notepad.exe

windbg -p 4200 // 將windbg附加到一個正在執行的pid為4200的程序上

windbg -pn "notepad.exe" // 將windbg附加到一個正在執行的名為notepad.exe的程序上

windbg –z "c:\mydumpfile.dmp" // 除錯mydumpfile.dmp檔案

.attach 0n4220 // 4220為十進位制pid,使用該命令附加除錯時,必須先存在一個除錯會話

.detach // 分離除錯

.restart // 重啟並除錯

.kill // 強制結束當前除錯

q // 退出windbg

#獲取幫助

? // 打印出所有標準命令

.help // 打印出所有元命令

.hh // 開啟windbg的chm幫助檔案

command /? // 列印命令command具體引數用法

#註釋符

* // 註釋整行

$$ // 註釋(遇到分號結束)

#配置除錯環境

.sympath // 檢視當前符號查詢路徑

.sympath c:\symbols // 將符號查詢路徑設為:c:\symbols

.sympath+ c:\symbols // 將c:\symbols新增到符號查詢路徑集合中

.symfix // 將符號查詢路徑設為:SRV*WinDbg安裝目錄\Sym*http://msdl.microsoft.com/download/symbols

.symfix f:\symbols // 將符號查詢路徑設為:SRV*f:\symbols*http://msdl.microsoft.com/download/symbols

.symfix+ f:\symbols // 將SRV*f:\symbols*http://msdl.microsoft.com/download/symbols新增到符號查詢路徑集合中

.srcpath // 檢視當前原始檔查詢路徑

.srcpath f:\src // 將原始檔查詢路徑設為:f:\src

.srcpath+ f:\src // 將f:\src新增到原始檔查詢路徑集合中

.exepath // 檢視可執行檔案查詢路徑

.exepath f:\bin // 將可執行檔案查詢路徑設為:f:\bin

.exepath+ f:\bin // 將f:\bin新增到可執行檔案查詢路徑集合中

#符號載入與檢視

除了使用ld和.reload命令直接載入符號檔案,某些使用符號的命令也可以觸發偵錯程式來載入符號,如:棧回溯命令(k*)和反彙編命令(u)等。

值得說明的是,windbg預設使用的是懶惰式符號載入策略,當它收到模組載入事件時,它通常是不會載入符號的,符號狀態顯示為deferred(延遲載入)。

.symopt // 顯示當前所有符號選項

.symopt+ flags // 新增符號選項

.symopt- flags // 刪除符號選項

ld * // 為所有模組載入符號

ld kernel32 // 載入kernel32.dll的符號

.reload // 為所有模組載入符號資訊

.reload /f /v // f:強制立即模式  v:詳細模式

.reload /f @"c:\windows\System32\verifier.dll" // 為指定模組載入符號資訊

x *! // 列出所有模組對應的符號資訊

lm // 列出所有模組對應的符號資訊

x ConsoleTest!* // 列出ConsoleTest模組中的所有符號

x ConsoleTest!add* // 列出ConsoleTest模組中的所有add開頭的符號

x /t /v ConsoleTest!* // 帶資料型別、符號型別和大小資訊,列出ConsoleTest模組中的所有符號

x kernel32!*LoadLib* // 列出kernel32模組中所有含LoadLib字樣的符號

u  // 反編譯

#斷點

bl // 列出所有斷點

bc * // 清除所有斷點

bc 1 // 清除1號斷點

bc 1 2 5 // 清除1號、2號、5號斷點

be *  // 啟用所有斷點

be 1 // 啟用1號斷點

be 1 2 5 // 啟用1號、2號、5號斷點

bd * // 禁用所有斷點

bd 1 // 禁用1號斷點

bd 1 2 5 // 禁用1號、2號、5號斷點

bp 7c801b00 // 在7c801b00地址處放置一個斷點

bp `ConsoleTest.cpp:36` // 在ConsoleTest.cpp的36行處放置一個斷點

bp main // 在main函式的起始處放置一個斷點

bp CSecondLoader::CSecondLoader // 在CSecondLoader的建構函式處放置一個斷點

bp `ConsoleTest.cpp:40` "j (poi(MyVar)>5) ''; 'g'" // 條件斷點 MyVar>5,執行空語句(;),斷住  否則繼續執行

bp `ConsoleTest.cpp:40` "j @eax = 0xa3 ''; 'g'" // 條件斷點 暫存器eax的值為0xa3時斷住

bu // 儲存斷點,其用法和bp一樣

bm add_* // 匹配add_開頭的函式,並在這些函式起始處都打上斷點

ba w4 0483dfe0 // 當對0483dfe0地址寫操作時停下

// ba [r|w|e] [Size] Addr      [r=read/write, w=write, e=execute], Size=[1|2|4 bytes]

#除錯執行控制

g // Go(F5)

gH // 執行gH命令強制讓偵錯程式返回已經處理了這個異常。【Go with Exception Handled】

// 系統收到這個回覆後會停止分發異常(因為偵錯程式聲稱已經處理了異常),恢復除錯目標繼續執行,

     //  但由於異常條件仍在,所以還會產生異常,於是再次分發,WinDBG再次中斷到命令模式。

gN // 【Go with Exception Not Handled】

     // 執行gN命令強制讓偵錯程式返回沒有處理了這個異常,那麼系統會進一步分發該異常,

// 如果沒有其他偵錯程式也不處理,最後系統會彈出程式終止對話方塊。

gu // 執行到當前函式完成時停下 【Go Up】

p   // 單步執行(F10)  【Step】

p 2 // 2為步進數目

pc // 執行到下一個函式呼叫處停下 【Step to  Next Call】

pa 7c801b0b // 執行到7c801b0b地址處停下  【Step to Adress】

t // Step into(F11) 【Trace】

tc // 執行到下一個進入點處停下 【Trace to Next Call】

ta 7c801b12 // 執行到7c801b12地址處停下 【Trace to Adress】

# 檢視變數

dt nRet // 檢視變數nRet的型別與值

dv // 顯示當前函式內所有區域性變數,函式引數

dv n* // 顯示當前函式內n開頭的所有區域性變數,函式引數

dv /t /i /V /a|/n|/z

/*****************************************

更加詳細地顯示當前函式內所有區域性變數,函式引數資訊
i = type (local, global, parameter)
t = data type
V = memory address or register location
-----------------------
a = sort by Addr, n = sort by name, z = sort by size

*****************************************/

#暫存器

r // 顯示所有暫存器資訊

r eax, edx // 顯示eax,edx暫存器資訊

r eax=5, edx=6 // 對暫存器eax賦值為5,edx賦值為6

#記憶體

da /c 5 7c801e02 // 從7c801e02記憶體處開始,顯示5個ascii字元

/*****************************************

d[a| u| b| w| W| d| c| q| f| D] [/c 列數] [地址]

a = ascii chars
u = Unicode chars
b = byte + ascii
w = word (2b)
W = word (2b) + ascii
d = dword (4b)
c = dword (4b) + ascii
q = qword (8b)
f = floating point (single precision - 4b)
D = floating point (double precision - 8b)

*****************************************/

dyb /c 3 7c801e02 // 從7c801e02記憶體處開始,顯示3個byte及二進位制

/*****************************************

dy[b | d] ..   // b = binary+byte     d = binary+dword

*****************************************/

#dump輸出

.dump /ma "d:\mydmpfile.dmp" // 將當前除錯程序輸出Dump檔案

#其他元命令

.tlist  // 顯示所有程序

.cls // 清除螢幕

#其他擴充套件命令

!analyze -v // 詳細顯示當前異常資訊

!peb // 格式化輸出PEB資訊(process's environment block)

!gle  // 列印當前執行緒最近的錯誤資訊

!gle -all  // 列印所有執行緒的最近的錯誤資訊

!error  897// 顯示錯誤碼為897的詳細描述資訊

#幫助

整理自http://www.cnblogs.com/Clingingboy/archive/2013/03/26/2983166.html

相關推薦

windbg學習——dump分析常用命令收集

#重要說明 (1) windbg命令分為標準命令,元命令和擴充套件命令。      標準命令提供最基本的除錯功能,不區分大小寫。如:bp  g  dt  dv  k等      元命令提供標準命令沒有提供的功能,也內建在除錯引擎中,以.開頭。如.sympath  .reload等      擴充套件命令用於

python資料分析與展示(三)

資料分析之表示 資料存取與函式 資料的CSV檔案存取 CSV (Comma‐Separated Value, 逗號分隔值) CSV是一種常見的檔案格式,用來儲存批量資料。 np.savetxt(frame, array, fmt=’%.

python資料分析與展示(二)

資料分析之表示 NumPy庫入門 資料的維度 一維資料 一維資料由對等關係的有序或無序資料構成,採用線性方式組織。 例如:3.1413, 3.1398, 3.1404, 3.1401, 3.1349, 3.1376。 對應列

python資料分析與展示(一)

資料分析之前奏 Anaconda IDE的使用方法 一個數據表達一個含義,一組資料表達一個或多個含義。 摘要 有損地提取資料特徵的過程。 基本統計(含排序)。 分佈/累計統計。 資料特徵。 相關性、

【asxxf的部落格】記錄分享xiaoshao的學習

二人轉www.errenzhuan.cc 小品www.pangdan.com 詩詞www.diantang.cn 廣場舞www.280.cc 養生www.yhys.com 購物狂www.9252.com (adsbygoogle

Caffe深度學習Cifar-10分類任務(上)

前言 Cifar-10資料集是深度學習領域一個常見的資料集。Cifar-10由60000張32*32的RGB彩色圖片構成,一共包含有飛機、汽車、鳥、毛、鹿、狗、青蛙、馬、船、卡車這10個類別。50000張訓練,10000張測試。常被用來作為分類任務來評價深度學

Python 原始碼分析:如何將一個類方法變為多個方法?

前一篇文章《Python 中如何實現引數化測試?》中,我提到了在 Python 中實現引數化測試的幾個庫,並留下一個問題: 它們是如何做到把一個方法變成多個方法,並且將每個方法與相應的引數繫結起來的呢? 我們再提煉一下,原問題等於是:在一個類中,如何使用裝飾器把一個類方法變成多個類方法(或者產生類似的效果

Tomcat 學習歷程Tomcat架構與核心類分析

前面的http及socket兩部分內容,主要是為了後面看Tomcat原始碼而學習的一些網路基礎。從這章開始,就開始實際深入到Tomcat的‘內在’去看一看。在分析Tomcat的原始碼之前,準備先看一下Tomcat的架構與一些核心類的簡單分析,並簡單介紹一下Tomcat是如何

Tomcat 學習歷程Tomcat啟動過程分析

本節通過跟蹤Tomcat的原始碼來分析Tomcat是如何啟動及裝配各個元件的。最好下載Tomcat的原始碼匯入到Eclipse,這樣方便跟蹤。方法可參考: http://www.cnblogs.com/huangfox/archive/2011/10/20/2218970.

python學習函數學習

python學習之函數進階1.名稱空間 python有三種名稱空間 內置名稱空間: 隨著python解釋器的啟動而產生 print(sum) print(max) 全局名稱空間: 文件的執行會產生全局名稱空間,指的是文件級別的定義名字都會放入該空間 x = 11 if x == 11: print

python學習函數學習(二)

python學習之函數進階二一、內置函數 zip函數: zip()是Python的一個內建函數,它接受一系列可叠代的對象作為參數,將對象中對應的 元素按順序組合成一個tuple,每個tuple中包含的是原有序列中對應序號位置的元素,然後返回由 這些tuples組成的list。若傳入參數的長度不等,則返回li

Spring Boot Web 學習 - 單元測試

自動生成 添加 學習 one 類文件 dma AC mock ring 可在類文件中,右鍵->GO TO->Test 自動生成測試文件 1.添加測試註解 簡單方法測試 @RunWith(SpringRunner.class)@SpringBootTes

Python學習----第七模塊筆記(Web開發Django數據庫操作)

long 機制 idt 4.5 gen git 表之間 protoc 小數 4、Django ORM 4.1、連接數據庫 創建Django工程後運行該工程,會在工程根目錄下創建db.sqlite3文件,為Django自帶的sqlite3數據庫(Django自帶的功能也需要數

強化學習(九)與Deep Q-LearningNature DQN

cal variable 模型 基礎 討論 比較 .com 回放 均方差     在強化學習(八)價值函數的近似表示與Deep Q-Learning中,我們講到了Deep Q-Learning(NIPS 2013)的算法和代碼,在這個算法基礎上,有很多Deep Q-Lear

零基礎Python學習路線,小白的路!

近幾年Python的受歡迎程度可謂是扶搖直上,當然了學習的人也是愈來愈多。一些學習Python的小白在學習初期,總希望能夠得到一份Python學習路線圖,小編經過多方彙總為大家彙總了一份Python學習路線圖。 對於一個零基礎的想學習python的朋友來說,學習方法很重要, 學習方法不對努力白費 一定要有一

21天轉型容器實戰營(十三容器Kubernetes安全原理分析-實戰)

[[email protected] ~]# kubectl get namespace NAME STATUS AGE default Active 8d kube-public Active 8d kube-system Acti

21天轉型容器實戰營(十二容器Kubernetes 儲存管理原理分析

大綱 為何需要儲存卷? 普通儲存卷 應用中使用普通卷 持久化儲存卷(PV) 持久化儲存卷申明(PVC) 應用中使用持久化卷 為何需要儲存卷? 容器部署過程中一般有以下三種資料: - 啟動時需要的初始資料,可以是配置檔案 - 啟動過程中產生的臨時資料,該臨時資料需要多個容器間共享 - 啟動過程中產

21天轉型容器實戰營(十一容器Kubernetes 儲存管理原理分析

[[email protected] day11]# cat pvc.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-evs-auto-example namespace: default

Redis學習筆記(十)訊息通知

任務佇列 使用LPUSH和RPOP命令操作列表來實現佇列 BLPOP key [key ...] timeout(s) BRPOP key [key ...] timeout(s) BLPOP/BRPOP是阻塞式,同時檢測多個鍵,如果所有鍵都沒有元素則阻塞,如果其中有一個鍵

ORACLE三:分析函式

有時候我們需要從DB中提取一些很複雜的資料,而標準SQL卻對此無能為力,或者是執行效率非常的低;比如我們需要提取如下資料:    逐行顯示各個部門的累計工資,每行包括部門內前面所有人的工資總和;    查詢各個部門工資最高的前N個人;    …… 語法 Function名稱(