一.Debug版本和Release版本的區別
Debug通常稱為調試版本,它包含調試資訊,並且不作任何最佳化,便於程式員偵錯工具。Release稱為發布版本,它往往是進行了各種最佳化,使得程式在代碼大小和運行速度上都是最優的,以便使用者很好地使用。
只有Debug版本的程式才能設定斷點、逐步執行、使用TRACE/ASSERT等調試輸出語句。Release版本不包含任何調試資訊,所以體積小、運行速度快。
一般而言Debug版本會比Release版本多出*.ilk檔案和*.pdb檔案。
1.*.ilk檔案
ilk尾碼全稱為“Incremental Linking”,意即增量連結。
VC6中,“Project Setting à Link (Category:General)”預設勾選“Link incrementally”;相應VC2005中,“項目屬性à配置屬性à連結器à常規à啟用增量連結”預設選項為“是(/INCREMENTAL)”。
當選定漸增型編譯連結時,連結器自動產生ILK檔案,記錄連結資訊,也就是每次重新編譯並不編譯所有的源檔案,只編譯改動過的檔案。而編譯器怎麼知道哪些編譯過哪些未編譯過呢,除了檢查修改時間外,這個ilk檔案也是很重要的資訊。
2.*.pdb檔案
pdb尾碼全稱為“Program Debug Database”,意即程式資料庫檔案。
VC6中,“Project Setting à Link (Category:General)”預設勾選“Generate debug info”, “Project Setting à Link (Category:Customize)”預設勾選“Use program database”;相應VC2005中,“項目屬性à配置屬性à連結器à調試”,預設“產生調試資訊”選項為“是(/DEBUG)”,預設“產生程式資料庫檔案”處填寫“.\Debug\*.pdb”。該選項對應的編譯開關為/PDB。
符號檔案(Symbol Files)是一個資料資訊檔,它包含了應用程式二進位檔案(比如EXE、DLL等)的調試資訊,專門用來作調試之用,最終產生的可執行檔在運行時並不需要這個符號檔案,但你的程式中所有的變數資訊都記錄在這個檔案中。所以調試應用程式時,這個檔案是非常重要的。用VC和 WinDbg偵錯工具時都要用到這個檔案。
關於符號檔案,參考《符號檔案—Windows 應用程式調試必備》。
二.VC常用調試操作
快速鍵
作用
F5
開始調試,逐斷點調試
F9
設定(取消)斷點
Ctrl+F10
調試到游標所在位置
F10
單步調試,遇到子函數跳過
F11
單步調試,遇到子函數跟蹤進入內部
Shift+F11
從當前函數中跳出
Shift+F5
停止調試
一般F9設斷點,F5啟動後,F10、F11和Shift+F11交替使用,以在多個斷點處調試。
三.聯合調試連結庫(lib、dll)項目和應用程式(exe)項目?
對於連結庫項目,必須要匯入一個能夠調用它的測試程式進來,通過應用程式的執行來達到調試的目的。
既然是調試,當然靜態或動態連結程式庫項目應產生帶調試資訊的Debug版本,VC6中“Project Setting à Link (Category:General)”預設勾選“Generate debug info”,相應VC2005中的“項目屬性à配置屬性à連結器à調試à產生調試資訊”預設選項為“是(/DEBUG)”。
關於*.obj檔案和*.lib檔案
obj:Intermediate file,CPP對應的二進位代碼格式,是未經重定位的!
lib:Object File Library,若干個obj的集合,本質與obj相同!
使用時,obj和lib是沒有本質區別的,lib就是obj,使用lib地方都可以使用obj。
對於*.cpp檔案中的static變數或函數,在*.obj或*.lib中既有符號資訊又有實體定義。
對於*.cpp檔案中的extern變數或函數,在*.obj或*.lib中一般都會有符號資訊,實體既可以定義在本檔案中,也可以在其他檔案中定義。對於extern變數或函數,連結時,將在所有的*.obj或*.lib中尋找實體。
Lib和Exe協調:
建立解決方案D:\ LibDemo\LibDemo(.dsw,.sln),在其下建立靜態庫(Win32 Static Library)項目MyLib(.dsp,.vcproj)和靜態庫測試專案(Win32 Console Application)MyLibDemo(.dsp,.vcproj)。首先需要為MyLibDemo項目附加標頭檔包含和連結庫包含。
(1)若設定MyLibDemo為啟動項目,執行F5調試命令,則在MyLib和MyLibDemo中的斷點處都會暫停。在MyLibDemo中可F11進入MyLib中的函數定義處。
(2)若設定MyLib為啟動項目,則要配置外部exe調用程式:
VC6中,“Project Setting àDebug(Category:General)”中的“Executable for debug session”處填寫exe路徑,例如:D:\ LibDemo\MyLibDemo\Debug\MyLibDemo.exe。相應VC2005中,“項目屬性à配置屬性à調試à命令”處填寫exe路徑。
執行F5調試命令,則在MyLib和MyLibDemo中的斷點處都會暫停。效果同(1)。
對於不同解決方案(.dsw,.sln)下的Lib項目和Exe項目協同調試方法同上。
Dll和Exe協調:
dll項目往往會附帶產生一個對應的lib,是dll匯出函數和符號連結資訊。同lib項目產生的lib有點不同,這裡只有原型資訊,實體代碼在dll中。dll是可實際啟動並執行二進位代碼,其中有定位代碼。
建立解決方案D:\DllDemo\DllDemo(.dsw,.sln),在其下建立動態庫(Win32 Dynamic-Link Library)項目MyDll(.dsp,.vcproj)和動態庫測試專案(Win32 Console Application)MyDllDemo(.dsp,.vcproj)。
同Lib和Exe協調一樣,首先需要為Exe項目附加標頭檔(.h)包含和連結庫(.lib)包含。
(1)若設定MyDllDemo為啟動項目,為了使MyDll.dll對調試exe可見,設定MyDllDemo的調試工作目錄(Working directory)為..\MyDll\Debug。
執行F5調試命令,則在MyDll和MyDllDemo中的斷點處都會暫停。在MyDllDemo中可F11進入MyDll中的函數定義處。
(2)若設定MyDll為啟動項目,則要配置外部exe調用程式:
VC6中,“Project Setting àDebug(Category:General)”中的“Executable for debug session”處填寫exe路徑,例如:D:\DllDemo\MyDllDemo\Debug\MyDllDemo.exe。相應VC2005中,“項目屬性à配置屬性à調試à命令”處填寫exe路徑。
為了使MyDll.dll對調試exe可見,設定調試工作目錄(Working directory)為.\Debug。
執行F5調試命令,則在MyDll和MyDllDemo中的斷點處都會暫停。效果同(1)。
對於不同解決方案(.dsw,.sln)下的Dll項目和Exe項目協同調試方法同上。
在(1)和(2)中,除了指定調試工作目錄外,還可以處理產生後事件,將產生的連結庫檔案直接複製到應用程式Debug目錄下。具體的,在VC6中“Project Setting àPost-built step”或VC2005中“項目屬性à配置屬性à建置事件à產生後事件”輸入產生後處理命令:copy .\Debug\MyDll.dll ..\MyDllDemo\Debug\MyDll.dll。當然,還可以將MyLib(MyDll)的輸出目錄直接指向MyLibDemo(MyDllDemo)的Debug下。
四.VC調試小結
我們在VC2005中printf函數調用處設定斷點,F11 將開啟printf函數的源碼檔案C:\Program Files\Microsoft Visual Studio 8\VC\crt\src\printf.c進入printf函數內部,實際上“工具à選項à項目和解決方案àVC++目錄à源檔案”中包含了crt原始碼的路徑:$(VCInstallDir)crt\src。
而在VC6中,C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC不存在,故試圖F11進入printf內部時,將彈出“Find Source”對話方塊,提示“Please enter the path for PRINTF.C”檔案。
調試VC時,編譯器之所以能夠跟蹤進入C庫函數,是因為編譯器本身附帶提供了Debug版本的CRT庫。
VC6中的MSVCRTD.DLL-MSVCRTD.LIB-MSVCRTD.PDB(對應VC2005中msvcr80d.dll-msvcrtd.lib)為C Runtime Library的Debug版本,其中包含了C運行庫的調試資訊。
VC6中的MSVCP60D.DLL-MSVCPRTD.LIB-MSVCP60D.PDB(對應VC2005中msvcp80d.dll - msvcprtd.lib)為C++ Runtime Library的Debug版本,其中包含了C++運行庫的調試資訊。
鑒於Debug版本對調試資訊的記錄和DllàLib(*.obj,*.lib)àSrc(*.c,*.cpp)的對應關係,在VC中我們就可以設定斷點跟蹤調試代碼。
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/phunxm/archive/2010/01/17/5203931.aspx