Visual Studio - Debug Class Library

為了使用程式碼的共用性來減少開發的時間,我們常常將功能模組化,然後模組各自獨立開發成類別庫,最後在以引用 DLL 的方式來使用這些模組。然而,當目標專案使用 DLL 的專案遇到類別庫發生錯誤時,要 Debug 類別庫就有點頭痛了。本篇就要來說明在有類別庫原始碼的情況下如何來Debug目標專案使用該類別庫的流程


在說明方法之前首先要確認是否有以下條件:
  1. 手邊有類別庫的原始碼
  2. 目標專案使用的類別庫版本與手邊類別庫原始碼版本相同

方法一

第一種方法純粹是使用 MSDN 上說明 Debug 類別庫的方法,主要是透過 VS 啟動外部程式來 Debug。步驟如下:

(P.S.:因為限量使用的是英文版,所以步驟中的選項會以英文為主)
1. 在類別庫專案按右鍵 => 選擇[Property]

2. 進到專案設置裡選擇[Debug]頁籤 => 勾選 [Start external programe] => 選擇目標專案的執行檔


3. [F5]開始Debug




方法二

方法二是方法一的逆向,主要是先啟動外部程式,然後從 VS 上將 Debug 程序連接到外部程式。步驟如下:

1. 先執行外部程式(exe檔)

2. 在 VS 上方點選 [Debug]頁籤 => 選 [Attach to Process] 
(P.S:可以直接用 [Ctrl] + [Alt] + [P] 快捷鍵)

3. 選取剛剛執行的外部程式 => 按 [Attach]

-----------------------------分隔線------------------------------

前兩種方法都是透過外部程式執行的方式,目標都是要 Debug 類別庫,但是如果我目標專案與類別庫要同時 Debug 那要怎麼辦呢?
這種情況就可以使用方法三。


方法三

方法三使用的是 PDB 檔案,PDB檔是偵錯所使用的符號表,就像是DLL的翻譯字典一樣。我們在編譯專案後,在 bin 資料夾底下可以看到編譯成功的 DLL 與 PDB,只要將類別庫專案編譯完產生的 PDB 檔複製到和目標專案讀取的類別庫 DLL 相同目錄下就好了,來看看會如何運作。

1. 複製 PDB 檔到 DLL 目錄下


2. 對目標專案執行 Debug


上圖可以看到執行 Debug 後馬上先跳到目標專案的中斷點,接下來按[F11]進入到kernel.Start()的定義(在 DLL 的原始碼中)。

上圖可以看到畫面進到類別庫專案的程式碼,所以代表兩邊是可以透過 PDB 穿越的。


注意:使用 PDB 檔案時要注意前面所提到的條件,"目標專案使用的類別庫版本與手邊類別庫原始碼版本相同",如果不相同的話,VS 的偵錯程序會依照 PDB 所指示的行數來執行,比如說 PDB 記載一個方法的結束在第50行,但是你的程式碼結束卻在第55行,那進行 Debug 就可以看到 VS 會在你的程式碼第50行就跳掉,就會覺得奇怪怎麼沒執行到底就跳掉了。



其實 PDB 檔案內部有紀錄產生此 PDB 檔的專案目錄,所以 VS 才能夠知道要去哪邊找這段程式碼。


參考來源:

MSDN - How to: Debug from a DLL Project
MSDN - PDB Files



留言