[VisualStudio]沒有完整Source Code不能偵錯,誰說的?

[VisualStudio]沒有完整Source Code不能偵錯,誰說的?

前幾天看到有人在談這個問題,他是這樣說的:『這個元件是別人寫的,現在出了問題,我要幫忙看,但是對方說只能提供出錯的那個cs檔的source給我,不能給我整個dll的專案Source,這叫我怎麼debug?』

我說:『那可以請他提供偵錯資訊檔嗎?』
他說:『什麼是偵錯資訊檔?』

請參考:
PDB 檔 (C#、J# 和 Visual Basic),其實它的中文名叫做程式資料庫(Program DataBase),但習慣上我都叫他偵錯資訊檔,因為它的說明是:程式資料庫 (PDB) 檔會保留偵錯和專案狀態資訊,以便您的程式進行偵錯組態的累加連結 (Incremental Link)。


這個檔案到底是什麼,其實你應該常常會看到這東西,但你總是選擇性的忽略它而已,我們先來看看,我先新增一個類別庫專案DebugTest:
image 

按下建置(Build)後到專案路徑下的bin/Debug下看看建置出來的結果,就發現,除了一個dll檔外,還有一個pdb檔,看到這邊應該喚醒你的記憶了吧,你肯定有看過它。
image 

廢話不多說,下面示範一下如何使用pdb檔+部分Source來偵錯,我先加入一個類別庫專案後,寫兩個Class檔,分別叫Test1跟Test2:
image 

然後我有另一個站台,這個站台中的程式會去參考到這個dll:
image 

為了要讓站台使用這個dll,我們會在站台中加入參考:
image 

在維護時,為了更即時的偵錯,我可能會選擇參考『專案』:
image 

成功加入參考後,我就可以在網站中使用這個dll中包含的類別了:
image

而要偵錯DebugTest.dll的程式的話,只要下好中斷點:
image

到該行程式按下F11就進入到DebugTest.Test1的程式碼中了:
image 

但這是在我們有完整的Source的狀況下,如果今天對方只提供Test1.cs檔、DebugTest.dll跟pdb檔時,我們該如何偵錯?
image

其實非常簡單,先還原一下環境,我有參考DebugTest,但沒有完整的專案可以用:
image 

接著確認一下你的bin目錄下有DebugTest.dll跟DebugTest.pdb檔:
image

接著開啟人家給妳的Test1.cs檔,給它來個中斷點:
 
image

勇敢的給它偵錯下去就對啦,你就發現沒那麼可怕吧,真的也進入偵錯狀態囉:
image 

所以這就是我們提的,只要有正確的dll與pdb檔,對應到正確版本的Source,即使只是部分的程式碼,我們還是可以進行debug,不過這邊要特別留意dll、pdb跟cs檔一定要是相同的版本才行,不然會出現如下狀況,Code比較新,dll、pdb比較舊:
image

無法進入偵錯狀態,且看了一下它的說明,會告知程式碼版本與原始版本(dll、pdb的內容)不同,當然了,你可以依它的建議調整成『允許原始程式碼與原始版本不同』,但這邊並不建議:
image 

這只是一個一般性的小技巧,給大家參考參考。

游舒帆 (gipi)

探索原力Co-founder,曾任TutorABC協理與鼎新電腦總監,並曾獲選兩屆微軟最有價值專家 ( MVP ),離開職場後創辦探索原力,致力於協助青少年培養面對未來的能力。認為教育與組織育才其實息息相關,都是在為未來儲備能量,2018年起成立為期一年的專題課程《職涯躍升的關鍵24堂課》,為培養台灣未來的領袖而努力。