VC調(diào)試以及TRACE()函數(shù)的用法

1.VC調(diào)試入門

1設(shè)置

為了調(diào)試一個程序,首先必須使程序中包含調(diào)試信息。一般情況下,一個從AppWizard創(chuàng)建的工程中包含的Debug Configuration自動包含調(diào)試信息,但是是不是Debug版本并不是程序包含調(diào)試信息的決定因素,程序設(shè)計者可以在任意的Configuration中增加調(diào)試信息,包括Release版本。

為了增加調(diào)試信息,可以按照下述步驟進行:

打開Project settings對話框(可以通過快捷鍵ALT+F7打開,也可以通過IDE菜單Project/Settings打開)

選擇C/C++頁,Category中選擇general ,則出現(xiàn)一個Debug Info下拉列表框,可供選擇的調(diào)試信息 方式包括:

命令行Project settings說明

無None沒有調(diào)試信息

/ZdLine Numbers Only目標(biāo)文件或者可執(zhí)行文件中只包含全局和導(dǎo)出符號以及代碼行信息,不包含符號調(diào)試信息

/Z7C 7.0- Compatible目標(biāo)文件或者可執(zhí)行文件中包含行號和所有符號調(diào)試信息,包括變量名及類型,函數(shù)及原型等

/ZiProgram Database創(chuàng)建一個程序庫(PDB),包括類型信息和符號調(diào)試信息。

/ZIProgram Database for Edit and Continue除了前面/Zi的功能外,這個選項允許對代碼進行調(diào)試過程中的修改和繼續(xù)執(zhí)行。這個選項同時使#pragma設(shè)置的優(yōu)化功能無效

選擇Link頁,選中復(fù)選框"Generate Debug Info",這個選項將使連接器把調(diào)試信息寫進可執(zhí)行文件和DLL

如果C/C++頁中設(shè)置了Program Database以上的選項,則Link incrementally可以選擇。選中這個選項,將使程序可以在上一次編譯的基礎(chǔ)上被編譯(即增量編譯),而不必每次都從頭開始編譯。

設(shè)置

為了調(diào)試一個程序,首先必須使程序中包含調(diào)試信息。一般情況下,一個從AppWizard創(chuàng)建的工程中包含的Debug Configuration自動包含調(diào)試信息,但是是不是Debug版本并不是程序包含調(diào)試信息的決定因素,程序設(shè)計者可以在任意的Configuration中增加調(diào)試信息,包括Release版本。

為了增加調(diào)試信息,可以按照下述步驟進行:

打開Project settings對話框(可以通過快捷鍵ALT+F7打開,也可以通過IDE菜單Project/Settings打開)

選擇C/C++頁,Category中選擇general ,則出現(xiàn)一個Debug Info下拉列表框,可供選擇的調(diào)試信息 方式包括:

命令行Project settings說明

無None沒有調(diào)試信息

/ZdLine Numbers Only目標(biāo)文件或者可執(zhí)行文件中只包含全局和導(dǎo)出符號以及代碼行信息,不包含符號調(diào)試信息

/Z7C 7.0- Compatible目標(biāo)文件或者可執(zhí)行文件中包含行號和所有符號調(diào)試信息,包括變量名及類型,函數(shù)及原型等

/ZiProgram Database創(chuàng)建一個程序庫(PDB),包括類型信息和符號調(diào)試信息。

/ZIProgram Database for Edit and Continue除了前面/Zi的功能外,這個選項允許對代碼進行調(diào)試過程中的修改和繼續(xù)執(zhí)行。這個選項同時使#pragma設(shè)置的優(yōu)化功能無效

選擇Link頁,選中復(fù)選框"Generate Debug Info",這個選項將使連接器把調(diào)試信息寫進可執(zhí)行文件和DLL

如果C/C++頁中設(shè)置了Program Database以上的選項,則Link incrementally可以選擇。選中這個選項,將使程序可以在上一次編譯的基礎(chǔ)上被編譯(即增量編譯),而不必每次都從頭開始編譯。

2斷點

斷點是調(diào)試器設(shè)置的一個代碼位置。當(dāng)程序運行到斷點時,程序中斷執(zhí)行,回到調(diào)試器。斷點是 最常用的技巧。調(diào)試時,只有設(shè)置了斷點并使程序回到調(diào)試器,才能對程序進行在線調(diào)試。

設(shè)置斷點:可以通過下述方法設(shè)置一個斷點。首先把光標(biāo)移動到需要設(shè)置斷點的代碼行上,然后

按F9快捷鍵

彈出Breakpoints對話框,方法是按快捷鍵CTRL+B或ALT+F9,或者通過菜單Edit/Breakpoints打開。打開后點擊Break at編輯框的右側(cè)的箭頭,選擇 合適的位置信息。一般情況下,直接選擇line xxx就足夠了,如果想設(shè)置不是當(dāng)前位置的斷點,可以選擇Advanced,然后填寫函數(shù)、行號和可執(zhí)行文件信息。

去掉斷點:把光標(biāo)移動到給定斷點所在的行,再次按F9就可以取消斷點。同前面所述,打開Breakpoints對話框后,也可以按照界面提示去掉斷點。

條件斷點:可以為斷點設(shè)置一個條件,這樣的斷點稱為條件斷點。對于新加的斷點,可以單擊Conditions按鈕,為斷點設(shè)置一個表達式。當(dāng)這個表達式發(fā)生改變時,程序就 被中斷。底下設(shè)置包括“觀察數(shù)組或者結(jié)構(gòu)的元素個數(shù)”,似乎可以設(shè)置一個指針?biāo)赶虻膬?nèi)存區(qū)的大小,但是我設(shè)置一個比較的值但是改動 范圍之外的內(nèi)存區(qū)似乎也導(dǎo)致斷點起效。最后一個設(shè)置可以讓程序先執(zhí)行多少次然后才到達斷點。

數(shù)據(jù)斷點:數(shù)據(jù)斷點只能在Breakpoints對話框中設(shè)置。選擇“Data”頁,就顯示了設(shè)置數(shù)據(jù)斷點的對話框。在編輯框中輸入一個表達式,當(dāng)這個 表達式的值發(fā)生變化時,數(shù)據(jù)斷點就到達。一般情況下,這個表達式應(yīng)該由運算符和全局變量構(gòu)成,例如:在編輯框中輸入 g_bFlag這個全局變量的名字,那么當(dāng)程序中有g(shù)_bFlag= !g_bFlag時,程序就將停在這個語句處。

消息斷點:VC也支持對Windows消息進行截獲。他有兩種方式進行截獲:窗口消息處理函數(shù)和特定消息中斷。

在Breakpoints對話框中選擇Messages頁,就可以設(shè)置消息斷點。如果在上面那個對話框中寫入消息處理函數(shù)的名字,那么 每次消息被這個函數(shù)處理,斷點就到達(我覺得如果采用普通斷點在這個函數(shù)中截獲,效果應(yīng)該一樣)。如果在底下的下拉 列表框選擇一個消息,則每次這種消息到達,程序就中斷。

3Watch

VC支持查看變量、表達式和內(nèi)存的值。所有這些觀察都必須是在斷點中斷的情況下進行。

觀看變量的值最簡單,當(dāng)斷點到達時,把光標(biāo)移動到這個變量上,停留一會就可以看到變量的值。

VC提供一種被成為Watch的機制來觀看變量和表達式的值。在斷點狀態(tài)下,在變量上單擊右鍵,選擇Quick Watch, 就彈出一個對話框,顯示這個變量的值。

單擊Debug工具條上的Watch按鈕,就出現(xiàn)一個Watch視圖(Watch1,Watch2,Watch3,Watch4),在該視圖中輸入變量或者表達式,就可以觀察 變量或者表達式的值。注意:這個表達式不能有副作用,例如++運算符絕對禁止用于這個表達式中,因為這個運算符將修改變量的值,導(dǎo)致 軟件的邏輯被破壞。

4Memory

由于指針指向的數(shù)組,Watch只能顯示第一個元素的值。為了顯示數(shù)組的后續(xù)內(nèi)容,或者要顯示一片內(nèi)存的內(nèi)容,可以使用memory功能。在 Debug工具條上點memory按鈕,就彈出一個對話框,在其中輸入地址,就可以顯示該地址指向的內(nèi)存的內(nèi)容。

5Varibles

Debug工具條上的Varibles按鈕彈出一個框,顯示所有當(dāng)前執(zhí)行上下文中可見的變量的值。特別是當(dāng)前指令涉及的變量,以紅色顯示。

6寄存器

Debug工具條上的Reigsters按鈕彈出一個框,顯示當(dāng)前的所有寄存器的值。

7進程控制

VC允許被中斷的程序繼續(xù)運行、單步運行和運行到指定光標(biāo)處,分別對應(yīng)快捷鍵F5、F10/F11和CTRL+F10。各個快捷鍵功能如下:

快捷鍵說明

F5繼續(xù)運行

F10單步,如果涉及到子函數(shù),不進入子函數(shù)內(nèi)部

F11單步,如果涉及到子函數(shù),進入子函數(shù)內(nèi)部

CTRL+F10運行到當(dāng)前光標(biāo)處。

Call Stack

調(diào)用堆棧反映了當(dāng)前斷點處函數(shù)是被那些函數(shù)按照什么順序調(diào)用的。單擊Debug工具條上的Call stack就顯示Call Stack對話框。在CallStack對話框中顯示了一個調(diào)用系列,最上面的是當(dāng)前函數(shù),往下依次是調(diào)用函數(shù)的上級函數(shù)。單擊這些函數(shù)名可以跳到對應(yīng)的函數(shù)中去。

其他調(diào)試手段

系統(tǒng)提供一系列特殊的函數(shù)或者宏來處理Debug版本相關(guān)的信息,如下:

8宏名/函數(shù)名說明

TRACE使用方法和printf完全一致,他在output框中輸出調(diào)試信息

ASSERT它接收一個表達式,如果這個表達式為TRUE,則無動作,否則中斷當(dāng)前程序執(zhí)行。對于系統(tǒng)中出現(xiàn)這個宏 導(dǎo)致的中斷,應(yīng)該認(rèn)為你的函數(shù)調(diào)用未能滿足系統(tǒng)的調(diào)用此函數(shù)的前提條件。例如,對于一個還沒有創(chuàng)建的窗口調(diào)用SetWindowText等。

VERIFY和ASSERT功能類似,所不同的是,在Release版本中,ASSERT不計算輸入的表達式的值,而VERIFY計算表達式的值。


一個好的程序員不應(yīng)該把所有的判斷交給編譯器和調(diào)試器,應(yīng)該在程序中自己加以程序保護和錯誤定位,具體措施包括:

對于所有有返回值的函數(shù),都應(yīng)該檢查返回值,除非你確信這個函數(shù)調(diào)用絕對不會出錯,或者不關(guān)心它是否出錯。

一些函數(shù)返回錯誤,需要用其他函數(shù)獲得錯誤的具體信息。例如accept返回INVALID_SOCKET表示accept失敗,為了查明 具體的失敗原因,應(yīng)該立刻用WSAGetLastError獲得錯誤碼,并針對性的解決問題。

有些函數(shù)通過異常機制拋出錯誤,應(yīng)該用TRY-CATCH語句來檢查錯誤

程序員對于能處理的錯誤,應(yīng)該自己在底層處理,對于不能處理的,應(yīng)該報告給用戶讓他們決定怎么處理。如果程序出了異常, 卻不對返回值和其他機制返回的錯誤信息進行判斷,只能是加大了找錯誤的難度。

另外:VC中要編制程序不應(yīng)該一開始就寫cpp/h文件,而應(yīng)該首先創(chuàng)建一個合適的工程。因為只有這樣,VC才能選擇合適的編譯、連接 選項。對于加入到工程中的cpp文件,應(yīng)該檢查是否在第一行顯式的包含stdafx.h頭文件,這是Microsoft Visual Studio為了加快編譯 速度而設(shè)置的預(yù)編譯頭文件。在這個#include "stdafx.h"行前面的所有代碼將被忽略,所以其他頭文件應(yīng)該在這一行后面被包含。

對于.c文件,由于不能包含stdafx.h,因此可以通過Project settings把它的預(yù)編譯頭設(shè)置為“不使用”,方法是:

彈出Project settings對話框

選擇C/C++

Category選擇Precompilation Header

選擇不使用預(yù)編譯頭。



注:轉(zhuǎn)自CSDN博客:http://blog.csdn.net/chocolateconanlan/article/details/4061545

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,983評論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,772評論 3 422
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,947評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,201評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,960評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,350評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,406評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,549評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,104評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,914評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,089評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,647評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,340評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,753評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,007評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,834評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,106評論 2 375

推薦閱讀更多精彩內(nèi)容