Visual C 一些開發心得與除錯技巧

2022-08-31 00:06:34 字數 4303 閱讀 8831

自己平時收集的一些技巧與心得,這裡分享出來,普及一下知識。

1.如何在release狀態下進行除錯

project->setting=>projectsetting對話方塊,選擇release狀態。c/c++標籤中的category選general,optimizations選disable(debug),debut info選program database。在link標籤中選中generate debug info核取方塊。

注:只是乙個介乎debug和release的中間狀態,所有的assert、verify都不起作用,函式呼叫方式已經是真正的呼叫,而不查表,但是這種狀態下quickwatch、呼叫佇列跟蹤功能仍然有效,和debug版一樣。

2. release和debug有什麼不同

release版稱為發行版,debug版稱為除錯版。

debug中可以單步執行、跟蹤等功能,但生成的可執行檔案比較大,**執行速度較慢。release版執行速度較快,可執行檔案較小,但在其編譯條件下無法執行除錯功能。

release的exe檔案鏈結的是標準的mfc dll(use mfc in a shared or static dll)。這些dll在安裝windows的時候,已經配置,所以這些程式能夠在沒有安裝visual c++ 6.0的機器上執行。而debug版本的exe鏈結了除錯版本的mfc dll檔案,在沒有安裝visual c++6.0的機器上不能執行,因為缺相應的dll,除非選擇use static dll when link。

3. assert和verify有什麼區別

assert裡面的內容在release版本中不編譯,verify裡面的內容仍然翻譯,但不再判斷真假。所以後者更安全一點。

例如assert(file.open(strfilename))。

一旦到了release版本中,這一行就忽略了,file根本就不open()了,而且沒有任何出錯的資訊。如果用verify()就不會有這個問題。

4.workspace和project之間是什麼樣的關係

每個workspace可以包括幾個project,但只有乙個處於active狀態,各個project之間可以有依賴關係,在project的setting..中可以設定,比如那個active狀態的project可以依賴於其他的提供其函式呼叫的靜態庫。

5. 如何在非mfc程式中使用classwizard

在工程目錄下新建乙個空的.rc檔案,然後加入到工程中就可以了。

6.如何設定斷點

按f9在當前游標處增加乙個斷點和取消乙個斷點。

另外,在編輯狀態下,按ctrl+b組合鍵,彈出斷點設定對話方塊。然後單擊【condition…】按鈕彈出設定斷點條件的對話方塊進行設定。

7.在編輯狀態下發現成員變數或函式不能顯示提示是如何開啟顯示功能

這似乎是目前這個visual c++ 6.0版本的乙個bug,可按如下步驟使其正常,如再出現,可如法炮製:

(1)關閉project

(2)刪除「工程名.ncb」檔案

(3)重新開啟工程

8.如何將乙個通過classwizard生成的類徹底刪除

首先在工作區的fileview中選中該類的.h和.cpp檔案,按delete刪除,然後在檔案管理器中將這兩個檔案刪除,再執行classwizard,這時出現是否移走該類的提示,選擇remove就可以了。

9. 如何將在workspace中消失的類找出來

開啟該類對應的標頭檔案,然後將其類名隨便改一下,這個時候工作區就會出現新的類,再將這個類改回原來的名字就可以了。

10. 如何清除所有的斷點

選單【edit】->【breakpoints…】,開啟「breakpoints」對話方塊,單擊【remove all】按鈕即可。快捷鍵是「ctrl + shift + f9」。

11. 如何再classwizard中選擇未列出的資訊

開啟「classwizard」對話方塊,然後切換到「class info」頁面。改變「message filter」,如選擇「window」,「message」頁面就會出現window的資訊。

12. 如何檢測程式中的括號是否匹配

把游標移動到需要檢測的括號前面,按快捷鍵「ctrl + ]」。如果括號匹配正確,游標就跳到匹配的括號處,否則游標不移動,並且機箱喇叭還會發出一聲警告。

13. 如何檢視乙個巨集(或變數、函式)的定義

把游標移動到要檢視的乙個巨集上,就比如說最常見的declare_map_message上按一下f12(或右鍵選單中的相關選單),如果沒有建立瀏覽檔案,就會出現提示對話方塊,按【確定】按鈕,然後就會跳到該巨集(或變數、函式)定義的地方。

14. 如何新增lib檔案到當前工程

單擊選單【project】->【settings…】彈出「project setting」對話方塊,切換到「link」標籤頁,在「object/library modules」處輸入lib檔名稱,不同的lib之間用空格格開。

15. 如何快速刪除專案下的debug資料夾中臨時檔案

在工作區的fileview檢視中選中對應的專案,單擊右鍵彈出選單,選擇【clean(selection only)】選單即可。

這是因為出現了未來檔案(修改時間和建立時間比系統時間晚)的緣故。可以這樣處理:找到工程資料夾下的debug目錄,將建立和修改時間都比系統時間的檔案全部刪除,然後再從新「rebuild all」一次。

18. 引起lnk2001的常見錯誤都有哪些

遇到的lnk2001錯誤主要為:unresolved external symbol 「symbol」

如果鏈結程式不能在所有的庫和目標檔案內找到所引用的函式、變數或標籤,將產生此錯誤資訊。

一般來說,發生錯誤的原因有兩個:一是所引用的函式、變數不存在,拼寫不正確或者使用錯誤;其次可能使用了不同版本的鏈結庫。以下是可能產生lnk2001錯誤的原因:

<1>由於編碼錯誤導致的lnk2001錯誤

(1)不相匹配的程式**或模組定義(.def)檔案導致lnk2001。例如,如果在c++原始檔了內宣告了一變數「var1」,卻試圖在另乙個檔案內以變數「var1」訪問改變量。

(2)如果使用的內聯函式是在.cpp檔案內定義的,而不是在標頭檔案內定義將導致lnk2001錯誤。

(3)呼叫函式時如果所用的引數型別和頭函式宣告時的型別不符將會產生lnk2001錯誤。

(4)試圖從基類的建構函式或析構函式中呼叫虛函式時將會導致lnk2001錯誤。

(5)要注意函式和變數的可公用性,只有全域性變數、函式是可公用的。靜態函式和靜態變數具有相同的使用範圍限制。當試圖從檔案外部方位任何沒有在該檔案內宣告的靜態變數時將導致編譯錯誤或lnk2001錯誤。

<2>由於編譯和聯機的設定而造成的lnk2001錯誤

(1)如果編譯時使用的是/nod(/noderaultlib)選項,程式所需要的執行庫和mfc時將得到又編譯器寫入目標檔案模組,但除非在檔案中明確包含這些庫名,否則這些庫不會被鏈結進工程檔案。這種情況下使用/nod將導致lnk2001錯誤

(2)如果沒有為wwinmaincrtstartup設定程式入口,在使用unicode和mfc時將出現「unresolved external on _winmain@16」的lnk2001錯誤資訊。

(3)使用/md選項編譯時,既然所有的執行庫都被保留在動態鏈結庫之內,原始檔中對「func」的引用,在目標檔案裡即對「__imp__func」的引用。如果試圖使用靜態庫libc.lib或libcmt.lib進行鏈結,將在__imp__func上發生lnk2001錯誤。如果不使用/md選項編譯,在使用msvcxx.lib鏈結時也會發生lnk2001錯誤。

(4)使用/ml選項編譯時,如用libcmt.lib鏈結會在_errno上發生lnk2001錯誤。

(5)當編譯除錯版的應用程式時,如果採用發行版模態庫進行鏈結也會產生lnk2001錯誤;同樣,使用除錯版模態庫鏈結發行版應用程式時也會產生相同的錯誤。

(6)不同版本的庫和編譯器的混合使用也能產生問題,因為新版的庫里可能包含早先的版本沒有的符號和說明。

(7)在不同的模組中使用內聯和非內聯的編譯選項能夠導致lnk2001錯誤。如果建立c++庫時開啟了函式內聯(/ob1或/ob2),但是在描述該函式的相應標頭檔案裡卻關閉了函式內聯(沒有inline關鍵字),只是將得到錯誤資訊。為避免該問題的發生,應該在相應的標頭檔案中用inline關鍵字標誌為內聯函式。

(8)不正確的/subsystem或entry設定也能導致lnk2001錯誤。

19. 如何除錯乙個沒有原始碼的exe檔案呼叫的dll

在visual c++ 6.0中,進入「project setting」對話方塊然後選擇debug標籤頁。通常visual studio預設「executable for debug session」為可執行檔名,但可以將他改成任何你想要的程式。甚至可以指定不同的工作目錄以及傳遞引數到你的程式。這個技術常用來除錯dlls、名字空間擴充套件、com物件和其他從某些exe以及從第三方的exe中呼叫的plug-in程式。

大一的一些心得與近況

下週就離開北方,從瀋陽飛西安 大一結束了,要填的坑太多了,總覺得要總結一下才能踏實的繼續學下去 你會選擇詩與遠方,還是會選擇柴公尺油鹽?而我還在苟且學習web安全,風雨兼程 總想著認真記錄部落格,可好久沒認真寫過了,偶然所得也是記在印象筆記上,想著哪一天心血來潮把它們都整理到部落格上,可是還是 懶 ...

學習PKI的一些心得與思考 1

為了專案需要.學習了一下pki.而且據說大三上也是要學這門課的.看了些許資料後大致了解了這個基本概念及實現方法和一些基本架構.以下是自己的一些總結思考.不是嚴格的教學內容.1 如果客戶端和服務端之間的通訊是用明文傳輸的.那麼黑客只要能夠抓到你的通訊包.也就能獲得你的所有資訊了.所以明文通訊是非常不安...

做共享軟體的一些心得與經驗

1.軟體的誕生與沉寂 2.軟體的宣傳與推廣 3.軟體的授權方式的選擇 當時將軟體做成免費的,一方面是軟體的知名度不高,希望通過免費的方式擴大使用者群,另一方面,是沒有找到一種很好的收費的辦法。網上有些共享軟體採用繫結機器授權的方式,但是該方式對使用者不太友好,使用者只能在一台電腦上使用。想在家裡和單...