上次我們提到,沒(méi)有源代碼而且沒(méi)有調(diào)試符號(hào),我們也可以 Debug。有人可能會(huì)問(wèn),我什么時(shí)候需要在這種情況下調(diào)試嗎?!

是的。比方說(shuō),我們用了某些第三方的組件,這些組件里面難免也會(huì)有 Bug。就算是微軟發(fā)布的 .net 組件,我們?cè)谀承﹤€(gè)別的例子中發(fā)現(xiàn)了 Bug。就算這些人家的組件都沒(méi)有問(wèn)題,有時(shí)候我們也不得不在程序運(yùn)行到組件中的某些語(yǔ)句時(shí)候查看一些數(shù)據(jù)。

舉個(gè)栗子:我們的程序用了某個(gè)組件A。當(dāng)用戶(hù)鼠標(biāo)單擊A的一個(gè)窗口的時(shí)候,A的某個(gè)方法應(yīng)該回掉我們的一個(gè)方法??墒撬谷粵](méi)有(我們?cè)谧约旱姆椒ㄉ霞恿藬帱c(diǎn),沒(méi)有被擊中)!如果我們?cè)谶@個(gè)時(shí)候能夠給組件中點(diǎn)擊事件的處理函數(shù)加上斷點(diǎn),我們就可以探一探究竟了。

下面我們就從易到難來(lái)看看如何調(diào)試別人家的組件。

我們先來(lái)看如何調(diào)試 .NET Framework 的組件。

1. 我們對(duì) VS 的 Options -> Debugging -> General 做一些配置,如下圖:

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團(tuán)訓(xùn)

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團(tuán)訓(xùn)

2. 我們要緩存 .NET 的調(diào)試符號(hào), 到 Options -> Debugging -> Symbols, 設(shè)置 Cache symbols in this directory 到一個(gè)本地的路徑。

配置完成,我們來(lái)做個(gè)實(shí)驗(yàn)。我們知道每個(gè) WPF 的窗口的構(gòu)造函數(shù)內(nèi)都會(huì)調(diào)用一個(gè) InitializeComponent() 方法。我們今天想看看這個(gè)方法它到底干了什么?;谝陨蟽牲c(diǎn)配置,我們新建一個(gè) WPF 程序,然后給這個(gè)方法設(shè)斷點(diǎn),當(dāng)程序運(yùn)行到該語(yǔ)句時(shí),我們點(diǎn)擊F11,哈,我們就進(jìn)入了微軟的代碼,請(qǐng)看:

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團(tuán)訓(xùn)

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團(tuán)訓(xùn)

是不是感覺(jué)很酷?

調(diào)試第三方的組件

這個(gè)我們要分幾種情況來(lái)看:

A. 第三方提供了調(diào)試符號(hào)

這種情況最簡(jiǎn)單。基于我們以上的設(shè)置,我們只需要把調(diào)試符號(hào)放到這些組建相同的目錄下即可。放到別處也可以,我們需要 VS 的 Options -> Debugging -> Symbols 添加一個(gè)新的 Symbol file location,然后開(kāi)始我們的調(diào)試。

B. 第三方?jīng)]有提供調(diào)試符號(hào),但代碼發(fā)布時(shí)沒(méi)有擾碼

這種情況也比較好辦。市場(chǎng)上有很多的反編譯工具,免費(fèi)的就有不少比方說(shuō) JustDecompile,dotPeek 等。他們不僅能反編譯,還能產(chǎn)生調(diào)試符號(hào),以便我們進(jìn)行調(diào)試。舉個(gè)例子,我用 JustDecompile 打開(kāi)了 log4net.dll(請(qǐng)點(diǎn)擊 Generate PDB):

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團(tuán)訓(xùn)

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團(tuán)訓(xùn)

有了調(diào)試符號(hào),我們要做的就跟情況A一樣了。

C. 第三方?jīng)]有提供調(diào)試符號(hào),但代碼發(fā)布時(shí)擾碼了

這種情況比較難辦。我們的目標(biāo)還是一樣的,需要有沒(méi)有擾碼的組件及調(diào)試符號(hào)。余下的都是一樣的。市場(chǎng)上有沒(méi)有反擾碼的工具呢?有,還有開(kāi)源的呢。今天就告訴大家一個(gè),名叫 de4dot,這個(gè)項(xiàng)目在 GitHub 的地址是:https://github.com/0xd4d/de4dot. 通過(guò)這個(gè)工具,我們可以把擾碼后生成的組件變成非擾碼的組建。剩下的還要做什么,相信大家都知道了吧(參考情況B)?
可惜的是,對(duì)于深度擾碼的組件,我們就需要更高級(jí)的反擾碼工具。當(dāng)然,我們也不需要這么做。情況C我們只會(huì)在極端情況下才會(huì)面對(duì),對(duì)吧?

哈哈,今天就到這里啦!