1. 程式人生 > >VC、VS2005除錯技巧

VC、VS2005除錯技巧

一、 引言
本文主要介紹以下幾方面內容:

常見編譯錯誤
VC偵錯程式
VC快捷鍵
VC專案檔案說明
環境引數的設定
F9         // 設定斷點
F5        // 除錯程式
F10        // 單步
F11        // 進入某個函式
Shift + F11    // 從某個函式跳出
Shift+ Alt + O   // 開啟檔名搜尋對話方塊
Alt + G      // 跳到定義處
Alt + M      // 輸入函式名的一部分,檢視某個函式
Alt + <-       // 退回到上一檢視
Alt + ->      // 前進到下一檢視 (這個快捷鍵是自定義的)
Ctrl + }      // 如當時游標在”{” 處,則跳到配對的 “}”。如當時游標在”}” 處,則跳到配對的 “{“。
Alt + 向上方向鍵 // 跳到上一個類或函式
Alt + 向下方向鍵 // 跳到下一個類或函式
Ctrl + /      // 加註釋(這個快捷鍵是自定義的)
Shift + F9    // 快速檢視變數
Alt + 3     // 檢視變數
Alt + 7     // 檢視堆疊
Alt + 6     // 檢視記憶體
Shift + F5    // 退出除錯程式
Ctrl + F5     // 執行程式,注意不是除錯
F7        // 編譯(如果編譯後,出現了很多警告和個別錯誤,可以再按一下,F7再編譯一次,這個時候,就會只出現錯誤,方便定位錯誤。)
Ctrl + I    // 輸入,增量搜尋(實時查詢)
Ctrl + F3    // 選中一個單詞時,跳到下個單詞(F3下一個,shift + F3 上一個)
Ctrl + Shift + F // 在檔案中查詢關鍵字,當前工程,當前文件,開啟的文件,自定義等
Ctrl + F2    // 某行加書籤 再按一次測去掉書籤
F2      // 跳到一個書籤,再按一下測跳到下一個書籤
Shift + F2    // 跳到上一個書籤
Ctrl + ->    // 跳到一個單詞最後
Ctrl + <-    // 跳到一個單詞最前
Ctrl + Shift + -> // 選擇游標後的一個單詞
Ctrl + Shift + <- // 選擇游標前的一個單詞
Shift + ->    // 選擇後的一個字母,每按一次增先一個字母
Shift + <-    // 選擇前的一個字母,每按一次增先一個字母
Ctrl + Shift + 空格 // 當游標在函式引數時,則提示函式引數列表
Ctrl + B      // 加條件斷點
Ctrl + L      // 刪除一行
Ctrl + Home   // 跳到文件最前面
Ctrl + End    // 跳到文件最後面
Home    // 跳到一行最前面
End      // 跳到一行最後面

二、常見編譯錯誤

  1. Fatal Error C1010
    unexpected end of file while looking for precompiled header directive
    這一般是由於使用了引數/Yu“stdafx.h”,意思是在每個檔案中都應該使用#include來包含這個標頭檔案。一般改正,就是在每個CPP檔案中包含這個檔案就可以。

l2. Error C2065
undeclared identifier
呼叫的方法或變數沒有定義。

l3. warning C4700
local variable ‘p’ used without having been initialized
使用的變數未經初始化。

l4. LNK2001
unresolved external symbol “symbol”(不確定的外部“符號”)。
如果連線程式不能在所有的庫和目標檔案內找到所引用的函式、變數或標籤,將產生此錯誤訊息。一般來說,發生錯誤的原因有兩個:

一是所引用的函式、變數不存在、拼寫不正確或者使用錯誤;

其次可能使用了不同版本的連線庫。

三、VC偵錯程式
1. 除錯環境的建立
在VC中每當建立一個工程(Project)時,VC會為你建立兩個版本,Release版本,和Debug版本(預設)。
Release版本是當程式完成後,準備發行時用來編譯的版本;
Debug版本是用在開發過程中進行除錯時所用的版本。
Debug 版本當中,包含著Microsoft格式的除錯資訊,不進行任何程式碼優化,而在Release版本對可執行程式的二進位制程式碼進行了優化,其中不包含任何的除錯資訊。
在新建立的工程中,你所看到是Debug版本,若要選擇Release版本,可以選擇選單Project中的Setting命令,這時螢幕上面彈出Project Setting對話方塊,在Setting For下拉列表中選擇Release。
這裡寫圖片描述


vc 圖

這裡寫圖片描述 vs2005 圖
2. 斷點(breakpoint)
分類:在VC中,你可以設定多種型別的斷點,我們可以根據斷點的性質把斷點分為三類:
一、與位置有關的斷點;(F9)
1. 與位置有關的邏輯斷點——到點條件成立才斷
有的時候你可能並不需要程式每次執行到這兒都停下來,而是在滿足一定條件的情況下才停下來,這時你就需要設定一種與位置有關的邏輯斷點。要設定這種斷點我們只需要在Edit中選中Breakpoint項,則彈出Breakpoint對話方塊,選其中的Location標籤,在Location頁面中單擊Condition按鈕,在Expression編輯框中寫出你的邏輯表示式,如X>=3或a+b>25,最後按OK返回。這種斷點主要是由其位置發生作用的,但也結合了邏輯條件,使之更靈活。 如圖:
這裡寫圖片描述

  1. 在在彙編程式碼上設立斷點:

    有時我們需要進入程式的彙編程式碼,更深入地除錯程式,因此要在彙編程式碼上設立斷點。要設立這種斷點我們只需選擇Debug Window中的Disassembly子命令,這時彙編視窗將會出現在螢幕上。在彙編視窗中你將看到對應於源程式的彙編程式碼,其中源程式是用黑體字顯示,下面是且對應的彙編程式碼。要設立斷點,我們只需將游標移到你想設斷點處然後點選工具條上的Insert/Remove Breakpoints 按鈕,此後你將會看到一個紅圓點出現在該彙編程式碼的右邊。

二、與邏輯條件有關的斷點;

  1. 邏輯條件觸發斷點的設定 ;
    – 選中Breakpoint對話方塊中的DATA標籤;
    – DATA頁面中的Expression編輯框中寫出你的邏輯表示式,如(6==sum);

這裡寫圖片描述

l2.監視表示式發生變化斷點;
– 選中Breakpoint對話方塊中的DATA標籤;
– 在Expression編輯框中寫出你需要監視的表示式;

l3.監視陣列發生變化的斷點
– 選中Breakpoint對話方塊中的DATA標籤;
– 在Expression編輯框中寫出你需要監視陣列名;
– 在Number of Elements 編輯框輸入你需要監視陣列元素的個數;
這裡寫圖片描述

l4.監視由指標指向的陣列發生變化的斷點;
– 選中Breakpoint對話方塊中的DATA標籤;
– 在Expression編輯框中輸入形如*pointname,其中*pointname為指標變數名;
– 在Number of Elements 編輯框輸入你需要監視陣列元素的個數;

l 5.監視外部變數發生變化的斷點;
– 選中Breakpoint對話方塊中的DATA標籤;
– 在Expression編輯框中輸入變數名;
– 點選在Expression編輯框的右邊的下拉鍵頭;
– 選取Advanced選項,這時Advanced Breakpoint 對話框出現;
– 在context框中輸入對應的函式名和(如果需要的話)檔名;

三、與WINDOWS訊息有關的斷點;

l注意:此類斷點只能工作在x86 或 Pentium 系統上。
– 選中Breakpoint對話方塊中的Message標籤;
– 在Break At WndProc 編輯框中輸入Windows 函式的名稱;
– 在Set One Breakpoint From Each Message To Watch下拉列表框中選擇對應的訊息;

應用斷點:如何控制程式的執行
當我們從選單Build到子選單Start Debuging 選擇Go 程式開始執行在Debug狀態下,程式會由於斷點而停頓下來後,可以看到有一個小箭頭,它指向即將執行的程式碼。隨後,我們就可以按要求來控制程式的執行:其中有四條命令:Step over, step Into , Step Out ,Run to Cursor 。
Step over 的功能是運行當前箭頭指向的程式碼(只執行一條程式碼)。F10
Step Into的功能是如果當前箭頭所指的程式碼是一個函式的呼叫,則用Step Into 進入該函式進行單步執行。F11
Step Out的功能是如當前箭頭所指向的程式碼是在某一函式內,用它使程式執行至函式返回處。Shift F11
Run to Cursor的功能是使程式執行至游標所指的程式碼處。Ctrl F10

  1. VC偵錯程式——查勘現場
    l檢視工具的使用
    除錯過程中最重要的是要觀察程式在執行過程中的狀態,這樣我們才能找出程式的錯誤之處。這裡所說的狀態包括各變數的值,寄存中的值,記憶體中的值,堆疊中的值 ,為此我們需要利用各種工具來幫助我們察看程式的狀態。
    先看一下這張圖,然後再看下面的介紹:
    這裡寫圖片描述

  2. 彈出式除錯資訊泡泡(Data Tips Pop_up Information)
    當程式在斷點停下來後,要觀察一個變數或表示式的值的最容易的方法是利用除錯資訊泡泡。要看一個變數的值,只需在源程式視窗中,將滑鼠放到該變數上,你將會看到一個資訊泡泡彈出,其中顯示出該變數的值。要檢視一個表示式的值,先選中該表示式,仍後將滑鼠放到選中的表示式上,同樣會看到一個資訊泡泡彈出以顯示該表示式的值。
    l

  3. 變數視窗(VARIABLE WINDOW)——看程式中的變數
    斷點處或其附近被訪問的變數的當前值。Variables視窗的下部有三個標籤:
    AUTO:顯示變數和函式返回值;
    LOCAL:顯示當前函式的區域性變數;
    THIS:在一個C++程式中,顯示this指標當前指向的物件;

3.觀察視窗(WATCH WINDOW)——索要變數或表示式的當前值
被偵錯程式直接跟蹤的變數和表示式的當前值。在Watch視窗中指定那些你在程式暫停時總想知道他們當前值的那些變數。
在觀察視窗中雙擊Name欄的某一空行,輸入你要檢視的變數名或表示式,回車後你將會看到對應的值。觀察視窗可有多頁,分別對應於標籤Watch1、Watch2、Watch3。假如你輸入的表示式是一個結構或是一個物件,你可以用滑鼠點取表示式右邊的形如 + ,以進一步觀察其中的成員變數的值。

4.快速檢視變數對話方塊(quick watch)
在快速檢視變數對話方塊中你可以象利用觀察視窗一樣來檢視變數或表示式的值。但我們還可以利用它來改變執行過程中的變數,具體操作如下:
(1)在Debug 選單,選擇Quick Watch命令,這時螢幕上將會出現Quick Watch 對話方塊;
(2)在Expression 編輯框中輸入變數名,按回車;
(3)在Current Value 格子中將出現變數名及其當前對應的值;
(4)如要改變該變數的值只需雙擊該變數對應的Name 欄,輸入你要改變的值;
(5)如要把該變數加入到觀察視窗中,點選Add watch 按鈕;
(6)點選Close 按鈕返回;
Shift F9 如圖:
這裡寫圖片描述

5.檢視記憶體中的值
一個指定地址的記憶體堆。
在Memory視窗中,在Address 編輯框中輸入你要檢視的記憶體地址,對應記憶體地址中的值將被顯示出來;
這裡寫圖片描述

6.檢視或改變CPU暫存器中的值
(1) 在Registers 視窗中,資訊以 Register = Value 的形式顯示,其中Register 代表暫存器的名字,Value 代表暫存器中的值;
(2)如果你要修改某一個暫存器的值,用TAB鍵或滑鼠將游標移到你想改變的值的右邊,然後輸入你想要的值。
l在暫存器中,有一類特殊的暫存器稱為標誌暫存器,其中有八個標誌位:
OV是溢位標誌
UP是方向標誌
EI是中斷使能標誌
Sign 是符號標誌
Zero是零標誌
Parity是奇偶較驗標誌
Carry 是進位標誌
這裡寫圖片描述

7.檢視Call Stack
在Call Stack視窗中可看到還未返回的呼叫函式列表,呼叫棧給出從巢狀函式呼叫一直到斷點位置的執行路徑。

8.檢視Disassembly視窗
編譯程式碼的組合語言翻譯,補充道螢幕上的源視窗中。“Disassembly”指的是把程式中的機器程式碼轉換為相應的彙編指令。

四、VC快捷鍵
VC編輯快捷鍵

按下Alt 鍵不放,點選滑鼠左鍵拖動,可以選擇文字塊、可選擇列;
按著Ctrl鍵不放,單擊一個單詞,可以選擇一個單詞,或雙擊;
將游標移在開始位置,按住shift點選滑鼠左鍵可選擇一段(在IE瀏覽其中照樣可用,看不到游標而已);
雙擊滑鼠左鍵可選擇一個單詞;
按住shift+上下方向鍵可選擇行;
按住ctrl+shift+左右方向鍵可選擇一個單詞;
按Ctrl+C可COPY游標所在的這一行;
按住shift+[End]可選擇本行;
F3 向下
Tab 選擇的行全部右移一個 TAB鍵的寬度
Alt + F8 按定義的格式重新排列選定的文字。
shift + F3 向上
shift + Tab 選擇的行全部左移一個 TAB鍵的寬度
Ctrl + F 查詢、搜尋
Ctrl + H 替換
Ctrl + G 到某行
Ctrl + U 選擇部分變為小寫
Ctrl + shift + U 選擇部分變為大寫
Ctrl+J 向上搜尋最近的#if/#else/#ifdef/#endif
Ctrl+K 向下搜尋最近的#if/#else/#ifdef/#endif
Ctrl+] 自動配對大括號或小括號。但有時不對應,是因為其他字元有“{”或“}”存在

VC除錯快捷鍵

F5 Go 執行碰到斷點就停
F7 Build 編譯連結
F9 Add/Remove Breakpoint 插入/刪除斷點
F10 Step Over 一步步執行,碰到函式不進去
F11 Step Into 一步步執行,碰到函式就進去(當然那些WinAPI由於在Dll中,就進不去了!)
Ctrl + F5 Execute Program 執行
Ctrl + F7 Compile 編譯一個原始檔
Ctrl + F10 Run to Cursor 除錯到游標所在位置
Shift + F5 Stop Debugging 停止除錯
Shift + F9 Quick Watch 快速檢視/修改變數資訊
Shift + F11 Step Out 從當前函式中跳出
Alt + F9 Breakpoint 高階斷點設定
Alt + 7 Call Stack 堆疊視窗,可以察看函式呼叫情況
Alt + 4 Variables 當前執行程式碼行的變數或者返回值資訊
Alt + 3 Watch 可以把關注的變數拖入視窗中,察看/修改變數資訊。

五、VC專案檔案說明
.opt工程關於開發環境的引數檔案,如工具條位置等資訊;
.dsp(DeveloperStudio Project)專案檔案,文字格式,專案引數配置檔案,不熟悉的話不要手工修改;
.dsw(DeveloperStudio Workspace)是工作區檔案,其他特點和dsp差不多,可以由.dsp生成;
.plg是編譯資訊檔案,編譯時的error和warning資訊檔案(實際上是一個html檔案),一般用處不大,在Tools->Options裡面有個選項可以控制這個檔案的生成;
以上是我們工程編譯時候最常見的,下邊這些可以不用關心,瞭解就可以了。
.aps(AppStudio File),資源輔助檔案,二進位制格式,一般不用去管他;
.clw ClassWizard資訊檔案,實際上是INI檔案的格式,有興趣可以研究一下,有時候ClassWizard出問題,手工修改CLW檔案可以解決,如果此檔案不存在的話,每次用ClassWizard的時候會提示你是否重建;
.hpj(Help Project)是生成幫助檔案的工程,用microsfot Help Compiler可以處理;
.mdp(Microsoft DevStudio Project)是舊版本的專案檔案,如果要開啟此檔案的話,會提示你是否轉換成新的DSP格式;
.map是執行檔案的映像資訊紀錄檔案,除非對系統底層非常熟悉,這個檔案一般用不著;
.pch(Pre-Compiled File)是預編譯檔案,可以加快編譯速度,但是檔案非常大;
.pdb(Program Database)記錄了程式有關的一些資料和除錯資訊,在除錯的時候可能有用;
.exp只有在編譯DLL的時候才會生成,記錄了DLL檔案中的一些資訊,一般也沒什麼用;
注:如果你想與別人共享你的原始碼專案,但是把整個專案做拷貝又太大。你完全可以刪掉以下檔案:
.dsw、.ncb、.opt、.aps、.clw、. plg檔案以及Debug、Release目錄下的所有檔案
六、環境引數的設定(Project Setting —> Alt F7)

VC的處理流程,大致分為兩步:
編譯:原始檔通過預編譯和編譯生成了.obj
檔案;
連結:所有.obj檔案和.lib檔案通過連結生成
.exe檔案或.dll檔案;
下面,我們分別討論這兩個步驟的一些細節。

lProject->Settings->C/C++
Project Option中各個引數代表的意義,可以參考MSDN,比如/nologo表示編譯時不在輸出視窗顯示這些設定(我們可以把這個引數去掉來看看效果)等等。
一般我們不會直接修改這些設定,而是通過這一頁最上面的Category中的各項來完成。
這裡寫圖片描述

General

Warning level
控制警告資訊,其中Level1是最嚴重的級別
Warnings as errors
將警告資訊當作錯誤處理
Optimizations
程式碼優化,可以在Category的Optimizations項中進行更細的設定
Generate browse info
用以生成.sbr檔案,記錄類、變數等符號資訊,可以在Category的Listing Files項中進行更多的設定
Debug info
生成除錯資訊
None
不產生任何除錯資訊(編譯比較快)
Line Numbers Only
僅生成全域性的和外部符號的除錯資訊到.OBJ檔案或.EXE檔案,減小目標檔案的尺寸
C7 Compatible
記錄偵錯程式用到的所有符號資訊到.OBJ檔案和.EXE檔案
Program Database
建立.PDB檔案記錄所有除錯資訊
Program Database for Edit and Continue
建立.PDB檔案記錄所有除錯資訊,並且支援除錯時編輯

C++ Language

pointer_to_member representation
用來設定類定義/引用的先後關係,一般為Best-Case Always表示在引用類之前該類肯定已經定義了
Enable Exception Handling
進行同步的異常處理
Enable Run-Time Type Information
迫使編譯器增加程式碼在執行時進行物件型別檢查
Disable Construction Displacements
設定類構造/解構函式呼叫虛擬函式問題

lCode Generation

Processor
表示程式碼指令優化,可以為80386、80486、Pentium、Pentium Pro,或者Blend表示混合以上各種優化

Use run-time library
用以指定程式執行時使用的執行時庫(單執行緒或多執行緒,Debug版本或Release版本),有一個原則就是,一個程序不要同時使用幾個版本的執行時庫,連線了單執行緒庫就不支援多執行緒呼叫,連線了多執行緒庫就要求建立多執行緒的應用程式
Single-Threaded
靜態連線LIBC.LIB庫
Debug Single-Threaded
靜態連線LIBCD.LIB庫
Multithreaded
靜態連線LIBCMT.LIB庫
Debug Multithreaded
靜態連線LIBCMTD.LIB庫
Multithreaded DLL
動態連線MSVCRT.DLL庫
Debug Multithreaded DLL
動態連線MSVCRTD.DLL庫
Calling convention
用來設定呼叫約定,有三種:__cdecl、__fastcall和__stdcall。各種呼叫約定的主要區別在於,函式呼叫時,函式的引數是從左到右壓入堆疊還是從右到左壓入堆疊;在函式返回時,由函式的呼叫者來清理壓入堆疊的引數還是由函式本身來清理;以及在編譯時對函式名進行的命名修飾(可以通過Listing Files看到各種命名修飾方式)
Struct member alignment
用以指定資料結構中的成員變數在記憶體中是按幾字節對齊的,根據計算機資料匯流排的位數,不同的對齊方式存取資料的速度不一樣。這個引數對資料包網路傳輸等應用尤為重要,不是存取速度問題,而是資料位的精確定義問題,一般在程式中使用#pragma pack來指定

Customize

Disable Language Extensions
表示不使用微軟為標準C做的語言擴充套件
Eliminate Duplicate Strings
主要用於字串優化(將字串放到緩充池裡以節省空間),使用這個引數,使得
char *sBuffer = “This is a character buffer”;
char *tBuffer = “This is a character buffer”;
sBuffer和tBuffer指向的是同一塊記憶體空間
Enable Function-Level Linking
告訴編譯器將各個函式按打包格式編譯
Enables minimal rebuild
通過儲存關聯資訊到.IDB檔案,使編譯器只對最新類定義改動過的原始檔進行重編譯,提高編譯速度
Enable Incremental Compilation
同樣通過.IDB檔案儲存的資訊,只重編譯最新改動過的函式
Suppress Startup Banner and Information Messages
用以控制引數是否在output視窗輸出

Listing Files

Generate browse info
上面已經提到過,這裡可以進行更多的設定
Exclude Local Variables from Browse Info
是否將區域性變數的資訊放到.SBR檔案中
Listing file type
可以設定生成的列表資訊檔案的內容
Assembly-Only Listing
僅生成彙編程式碼檔案(.ASM副檔名)
Assembly With Machine Code
生成機器程式碼和彙編程式碼檔案(.COD副檔名)
Assembly With Source Code
生成原始碼和彙編程式碼檔案(.ASM副檔名)
Assembly, Machine Code, and Source
生成機器碼、原始碼和彙編程式碼檔案(.COD副檔名)
Listing file name
生成的資訊檔案的路徑,一般為Debug或Release目錄下,生成的檔名自動取原始檔的檔名

Optimizations

Maximize Speed
生成最快速的程式碼
Minimize Size
生成最小尺寸的程式
Customize
定製優化
Assume No Aliasing
不使用別名(提高速度)
Assume Aliasing Across Function Calls
僅函式內部不使用別名
Global Optimizations
全域性優化,比如經常用到的變數使用暫存器儲存,或者迴圈內的計算優化,如
i = -100;while( i < 0 ){i += x + y;}
會被優化為i = -100;t = x + y;
while( i < 0 ){i += t;}
Generate Intrinsic Functions
使用內部函式替換一些函式呼叫(提高速度)
Improve Float Consistency
浮點運算方面的優化
Favor Small Code
程式(exe或dll)尺寸優化優先於程式碼速度優化
Favor Fast Code
程式(exe或dll)程式碼速度優化優先於尺寸優化
Frame-Pointer Omission
不使用幀指標,以提高函式呼叫速度
Full Optimization
組合了幾種引數,以生成最快的程式程式碼
Inline function expansion
行內函數擴充套件的三種優化(使用內聯可以節省函式呼叫的開銷,加快程式速度)
Disable
不使用內聯
Only __inline
僅函式定義前有inline或__inline標記使用內聯
Any Suitable
除了inline或__inline標記的函式外,編譯器“覺得”應該使用內聯的函式,都使用內聯

lPrecompiled Headers

預編譯標頭檔案的設定。使用預編譯可以提高重複編譯的速度。VC一般將一些公共的、不大變動的標頭檔案(比如afxwin.h等)集中放到stdafx.h中,這一部分程式碼就不必每次都重新編譯(除非是Rebuild All)

lPreprocessor

預編譯處理。可以定義/解除定義一些常量,Additional include directories可以指定額外的包含目錄,一般是相對於本專案的目錄,如..\Include。

lProject->Settings->Link
這裡寫圖片描述

General
一些總體設定,可以設定生成的檔案路徑、檔名、連線的庫檔案。

Generate debug info
生成Debug資訊到.PDB檔案(具體格式可以在Category->Debug中設定)
Ignore All Default Libraries
放棄所有預設的庫連線
Link Incrementally
通過生成. ILK檔案實現遞增式連線以提高後續連線速度,但一般這種方式下生成的檔案(EXE或DLL)較大
Generate Mapfile
生成.MAP檔案記錄模組相關資訊
Enable Profiling
這個引數通常與Generate Mapfile引數同時使用,而且如果產生Debug資訊的話,不能用.PDB檔案,而且必須用Microsoft Format。

lCustomize
這裡可以進行使用程式資料庫檔案的設定。
Force File Output:強制產生輸出檔案(EXE或DLL);
Print Progress Messages:可以將連線過程中的進度資訊輸出到Output視窗;

lDebug
設定是否生成除錯資訊,以及除錯資訊的格式。
格式可以有Microsoft Format、COFF Format(Common Object File Format)和Both Formats三種選擇;Separate Types表示將Debug格式資訊以獨立的.PDB檔案存放,還是直接放在各個原始檔的.PDB檔案中。選中的話,表示採用後者的方式,這種方式除錯啟動比較快。

lInput
這裡可以指定要連結的庫檔案,放棄連結的庫檔案。還可以增加額外的庫檔案目錄,一般是相對於本專案的目錄,如..\Lib。
Force Symbol References可以指定連線特定符號定義的庫。

lOutput
lBase Address可以改變程式預設的基地址(EXE檔案預設為0x400000,DLL預設為0x10000000)。作業系統裝載一個程式時總是試著先從這個基地址開始。
lStack allocations,用以設定程式使用的堆疊大小(請使用十進位制),預設為1兆位元組。Version Information告訴聯結器在EXE或DLL檔案的開始部分放上版本號。

Entry-Point Symbol
可以指定程式的入口地址,一般為一個函式名(且必須採用__stdcall呼叫約定)。一般Win32的程式,EXE的入口為WinMain,DLL的入口為DllEntryPoint;最好讓聯結器自動設定程式的入口點。預設情況下,通過一個C的執行時庫函式來實現:控制檯程式採用mainCRTStartup (或wmainCRTStartup)去呼叫程式的main (或wmain)函式;Windows程式採用WinMainCRTStartup (或 wWinMainCRTStartup)呼叫程式的WinMain (或 wWinMain,必須採用__stdcall呼叫約定);DLL採用_DllMainCRTStartup呼叫DllMain函式(必須採用__stdcall呼叫約定)。

其他一些引數的設定
(1)Project->Settings->General,可以設定連線MFC庫的方式(靜態或動態)。如果是動態連線,在你的軟體釋出時不要忘了帶上MFC的DLL。

(2)Project->Settings->Debug,可以設定除錯時執行的可執行檔案,以及命令列引數等。
(3)Project->Settings->Custom Build,可以設定編譯/連線成功後自動執行一些操作。比較有用的是,寫COM時希望VC對編譯通過的COM檔案自動註冊,可以如下設定:
Description: Register COM
Commands: regsvr32 /s /c (TargetPath)echoregsvr32exe.time>(TargetDir)$(TargetName).trg
Outputs: $(TargetDir)\$(TargetName).trg

(4)Tools->Options->Directories,設定系統的Include、Library路徑。

l注:值得注意的是,上面各個引數是大小寫敏感的;在引數後加上“-”表示該引數無效;各個引數值選項有“*”的表示為該引數的預設值;可以使用頁右上角的“Reset”按鈕來恢復該頁的所有預設設定。

七、總結

VC提供了一個很好的Debug工具,其提供的呼叫棧、條件斷點、資料斷點、反彙編等工具足夠強大,足夠應付平常的Bug,程式設計師不僅應具有對Bug的定位能力,更為主要的還是對於除錯工具的掌握、使用的能力。所謂“磨刀不誤砍柴工”,在開發之前或者開發閒暇時,好好的研究一下一些開發、除錯工具不失為提升這種能力的好辦法。能靜下心來思考一下這些工具的工作原理就更好了,這樣不僅能幫助你在程式設計的時候預見Bug,並且對你提高你的程式設計技巧也會有所幫助。