Windbg培訓筆記之一(基礎篇)

2021-05-18 05:06:28 字數 1373 閱讀 8557

windbg培訓筆記一(基礎篇)主講人:nick xiao

windbg是微軟

提供的應用程式,可以在微軟

的官方**

windbg

提供了使用者態和核心態的除錯能力。

vc6和vs2008都提供了debug的功能,那為什麼我們還需要用windbg這個工具呢?簡單來說,假如你的程式在客戶那裡出現了問題,比如說crash或者hang住,這個時候你該怎麼辦?到客戶機器上裝乙個vc6或者vs2008,然後再把源**拷貝過去?看起來似乎工程浩大,而且效果不是很好。想象一下,如果在程式crash的時候,我們能對當前的記憶體、堆疊等等作乙個快照,然後根據這個快照,我們就能很容易的分析出程式出現了什麼問題,那生活似乎會美好很多。是的,windbg就是提供了這個功能。唯一的問題是,windbg沒有visual stdio那麼好用,它的功能都是基於命令列的,也許你一開始你會無所適從,你需要一段時間來適應它。

第三步,設定release版本的編譯選項,編譯出來pdb檔案。應該說,pdb是windbg的靈魂,離開了pdb,windbg可以說什麼也不是。我們平時應該都有過除錯debug版的經歷,其實release版本也是可以用來除錯的。關鍵就在於要enable兩個編譯選項。enable這兩個選項以後,不會對生成的目標檔案有太大的影響,最多size會大一點點而已。

第四步,有了pdb以後,同時也設定好符號伺服器的位置。我們就可以對release版本的程式進行除錯。

似乎一切看起來都差不多了,但是,怎麼才能在程式crash的時候記錄下dump檔案呢?其實很簡單,我們主要註冊unhandledexceptionhandler來捕捉程式crash的時間,然後呼叫windbg的方法來寫dump檔案。

當發生異常時,比如記憶體訪問違例時,cpu硬體會發現此問題,並產生乙個異常(你可以把它理解為中斷)

然後cpu會把**流程切換到異常處理服務例程。作業系統異常處理服務例程會檢視當前程序是否處於除錯狀態

如果時,則通知偵錯程式發生了異常,如果不是則作業系統會檢視當前執行緒是否安裝了的異常幀鏈(fs[0]),如果安裝了seh(try.... catch....),則呼叫seh,並根據返回結果決定是否全域性展開活區域性展開。如果異常鏈中所有的seh都沒有處理此異常,而且此程序還處於除錯狀態,則作業系統會再次通知偵錯程式發生異常(二次異常)。如果還沒人處理,則呼叫作業系統的預設異常處理** unhandledexceptionhandler,不過作業系統允許你hook這個函式,就是通過 setunhandledexceptionfilter函式來設定。大部分異常通過此種方法都能捕獲,不過棧溢位、覆蓋的有可能捕獲不到。

minidumpwritedump是ms dbghelp.dll 中乙個api, 用於匯出當前執行的程式的dump. 這個dll程式系統中就有, 但是很多軟體, 都在自己的安裝目錄下儲存了這個.dll的最新的版本.

Oracle基礎篇之一

size small 好久沒有更新我的部落格了,今天跟大家分享一下有關oracle的一些基礎知識。1.資料庫分類 a.小型資料庫 access,foxbase b.中型資料庫 mysql,sql server,informix c.大型資料庫 sybase,oracle,db2 2.如何選擇資料庫 ...

Git基礎篇之一

git config global user.name your name git config global user.email your email domain.com 1.config 的三個作用域 local 只對某個倉庫有效,git config 配置預設 命令時,等同於 local ...

php基礎篇之一

1.php是什麼 官方文件 超文字預處理器 2.php能夠做一些什麼?php主要應用在一下領域 1 伺服器端指令碼,需要 php解析器,php伺服器,php瀏覽器。2 命令列指令碼,只需要php解析器,但是依賴於cron linux unix環境 和task scheduler windows環境 ...