vs下調試多個c項目聯調

來源:互聯網
上載者:User

一.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 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.