揚長避短使用Windbg和Visual Studio高效調試調試你的代碼
經常被問及這樣的問題:
你為什么非要使用Windbg調試你的程序?
記得有一次面試的時候筆者也被問到這樣的問題,我的回答是:不是我非要使用Windbg, 只是在不同的情況下使用不同的工具會更加方便而高效。
那么這兩者到底有什么區別?在什么情況下用什么工具會更方便呢?
所謂尺有所短,寸有所長,那么筆者就總結一下在什么情況下用什么工具會更方便,可能不是100%的全面,但是應該可以說明一定的問題,希望給初學者以指引。
Case 1:
分析.dmp文件的時候,可以使用Windbg和Visual Studio,但是windbg更高效,.dmp文件是發生問題時的進程轉儲文件,windbg集成了一系列的基本命令和擴展命令,一句話,只要是.dmp文件里面有的,你都可以很快的得到。
Case 2:
問題沒有辦法重現,就是說測試人員並不知道問題是怎么跑出來的,或者代碼跑了幾個月,跑出來一個問題,沒有辦法調試,只能抓一個.dmp文件,然后就回到了Case 1.
Case 3:
內核調試,包括驅動,系統代碼,他們本身是運行在內核級的,而我們的程序運行在用戶態,如果希望調試這部分代碼,Visual Studio似乎有些力不從心,這個時候就是windbg發揮的時候了。
Case 4:
調試多線程死鎖問題,用windbg很容易分析出來那個線程占用了那個鎖。
Case 5:
分布式,RPC調用,利用Visual Studio看那個組件調用哪個組件很不方便,而是用windbg卻是一目了然。
Case 6:
內存破壞問題,Visual Studio如果想查看內存破壞問題簡直比登天還難,除非破壞完了馬上crash,但是大部分的情況是內存破壞了,但是並不來表現出來,包括對破壞,棧破壞,windbg幾個命令就可以輕松搞定。
Case 7:
內存泄漏問題,結合umdh, leakdiag這兩個工具,再加上windbg的內存分析,可以說沒有查不出來的內存泄漏。
注意:Windbg調試.Net代碼需要SOS擴展..
總結
首先需要說明的是本文的目的並不是說Visual Studio和Windbg這兩個工具哪個好哪個差,只是說在不同的場合不同的工具可能更加高效,請大家不要誤解。另外Visual Studio絕對是Windows開發的利器, 在大多數Windows代碼開發,調試方面具有不可替代的作用,如果說Visual Studio是利器,那么Windbg絕對是個神器,在一些極端的場合絕對可以獨當一面。本文並沒有羅列所有的cases, 如果大家有什么好的建議可以提出來,如果有必要的話,我會繼續補充更多的cases. 待續..