除錯程式中包含了應用程式的符號資訊。符號資訊意味著跟蹤(例如)未編譯**中使用的變數名,這樣,它們就可以匹配已編譯的機器碼應用程式中現有的值。符號資訊包含在.pdb檔案中,這些檔案位於計算機的debug目錄下。除錯程式可以執行許多有用的操作,包括:
在output視窗中,可以檢視與**的編譯和執行相關的資訊,包括在編譯過程中遇到的錯誤等,還可以將自定義資訊直接寫到視窗中。
輸出除錯資訊可以使用下列兩個命令:
debug.writeline()
trace.writeline()
這兩個命令函式的使用方法幾乎完全相同,但有乙個關鍵的區別。第乙個命令僅在除錯模式下執行,而第二個命令還可以用於發布程式。
注意這兩個函式的用法與console.writeline()是不同的。其第乙個的字串引數是用於輸出訊息,而不需要使用語法插入變數值。這意味著必須使用+運算子在字串中插入變數值。第二個字串引數,用於顯示輸出文字的類別,這樣可以區別不同地方輸出類似的訊息。這兩個函式的一般輸出格式是:
:[示例]
class program
;int maxvalindices;
int maxval = maxima(testarray,out maxvalindices);
console.writeline("maximum value found at element indices:",maxval);
foreach(int index in maxvalindices)
console.readkey();
}static int maxima(int integers,out int indices)
else
}trace.writeline("maximum value " + maxval + "found,with " + count +
" occurrences.");
debug.writeline("maximum value search completed.");
}return maxval;}}
除了debug.writeline、trace.writeline之外,還有其他函式可以用於輸出除錯資訊。首先是與console.write()等價的函式:
這兩個函式使用與writeline()函式相同的語法,但它們是有區別的,因為它們沒有新增行尾字元。
還有下述函式:
這些函式的引數都與沒有if的函式相同,但增加了乙個必選引數,且該引數在列表引數的最前面。這個引數額值為布林值(或者為計算結果為布林值的表示式),只有這個值為true,函式才會輸出文字。
1、跟蹤點
把資訊輸出到輸出視窗中的另一種方法是使用跟蹤點。跟蹤點是輸出除錯資訊且不修改**的一種方式。新增跟蹤點的過程如下所示:
(1)把游標放在要插入跟蹤點的**行上。
(2)右擊該行**,選中斷點|插入跟蹤點。
(3)在開啟的「當斷點命中時」對話方塊中,在「列印訊息」文字框中輸入要輸出的字串。如果要輸出變數值,應把變數名放在花括號中。
(4)單擊ok。
(5)在包含跟蹤點的**行左邊會出現乙個紅色的菱形,該行**也會突出顯示為紅色。
還有乙個視窗可用於快速檢視應用程式中的跟蹤點。要顯示這個視窗,在除錯狀態下可用從vs選單中選中除錯選擇除錯|視窗|斷點。這是顯示斷點的通用視窗。可以定製顯示資訊,從這個視窗的「列」下拉框選中「命中次數」,顯示與跟蹤點關係密切的資訊。
在**視窗右擊跟蹤點,或者利用斷點視窗,可用刪除或臨時禁用跟蹤點。在斷點視窗中,跟蹤點右邊的核取方塊確定是否啟用跟蹤點;禁用的跟蹤點未被選中,在**視窗中顯示為菱形框,而不是實心菱形。
輸出除錯資訊的兩種方法:
(1)診斷輸出:總是要從程式中輸出除錯結果時使用這種方法,尤其是要輸出的字串比較複雜,涉及幾個變數或許多資訊的情況下,使用該方法比較好。另外,如果要在發布模式下獲得執行應用程式的除錯結果,trace命令常常是唯一的選擇。
(2)跟蹤點:除錯應用程式時,希望快速輸出重要資訊,以便解決語義錯誤,應使用跟蹤點。
7.1.2 中斷模式下的除錯
進入中斷模式的最簡單方式是在執行程式時,單擊vs中的暫停按鈕。暫停應用程式是進入中斷模式的最簡單方式,但這並不能更好地控制停止程式執行的位置。一般情況下,最後使用斷點。
(1)、斷點
斷點是源**中自動進入中斷模式的乙個標記。它們可用配置為:
新增斷點有幾種方法。要新增乙個斷點,當遇到該斷點所在的**行時,就中斷執行,可以單擊該**行左邊的灰色區域;右擊該行**;選擇斷點|插入斷點選單項;從vs選單中選擇除錯|切換斷點;或者按下f9。斷點在該**行的旁邊顯示為乙個紅色的圓,而該**也突出顯示。
在斷點視窗中,可用禁用斷點(刪除描述資訊左邊的記號;禁用的斷點為未填充的紅色圓圈來表示),刪除斷點,編輯斷點的屬性。
帶有附加屬性集(例如條件或遇到斷點次數)的斷點,在顯示時略有區別,已配置的斷點不是顯示乙個簡單的紅色圓圈,而是在紅色的圓圈中有乙個白色的加號。
(2)、進入中斷模式的其他方式
進入中斷模式還有兩種方式。一種是在產生乙個未處理的異常時選擇進入該模式。另一種方式是在生成乙個判定語句時中斷。
判定語句是可以用使用者定義的訊息中斷應用程式的指令。它們常常用於應用程式的開發過程,作為測試程式是否能平滑執行的一種方式。例如,在應用程式的某一處要求給定的變數值小於10,此時就可以使用乙個判定語句,確定它是否為true,如果不是,就中斷程式的執行。當遇到判定語句時,可以選擇abort,中斷應用程式的執行,也可以選擇retry,進入中斷模式,還可以選擇ignore,讓程式像往常一樣繼續執行。
與前面的除錯輸出函式一樣,判定函式也有兩個版本:
debug.assert()
trace.assert()
這兩個函式帶三個引數。第乙個引數是乙個布林值,其值為false會觸發判定語句。第
二、三個引數是兩個字串引數,分別把資訊寫到彈出的對話方塊和輸出視窗。
判定語句通常在應用程式的早期使用比較有效。可以推出應用程式的乙個發布程式,其中包含trace.assert()函式,以列出各種資訊。如果觸發了判定語句,使用者就會收到通知,把這些訊息傳遞給開發人員。這樣,即使開發人員不知道錯誤是如何發生的,也可以改正這個錯誤。
2、監視變數的內容
檢視變數值的最簡單方式是在中斷模式下,使滑鼠指向源**中的變數名,此時會出現乙個黃色的工具提示,顯示該變數的資訊,其中包括該變數的當前值。
還可以高亮度顯示整個表示式,以相同的方式得到該表示式的結果。對於比較複雜的值例如陣列,甚至可以擴充套件工具提示中的值,檢視各個陣列元素。
在除錯狀態可以修改變數的值,只需在value列中為要編輯的變數輸入乙個新值即可。
watch視窗至多可以有4個,它可以監視特定變數或涉及特定變數的表示式。要使用這個視窗只需在name列中輸入變數名或表示式,就可以檢視它們的結果,注意並不是應用程式中的所有變數在任何時候都可以用,並watch視窗對變數做出標記。要在watch視窗新增變數,還可以直接把變數從源**拖到該視窗。
在watch視窗中可以訪問變數的各種結果,乙個優點是它們可以顯示變數在斷點之間的變化情況。新值顯示為紅色而不是黑色,所有很容易看出哪個值發生了變化。
要新增更多的watch的視窗,可以在中斷模式下,使用除錯|視窗|監視|監視n選單選項開啟或關閉監視的四個視窗。每個視窗都可以包含變數和表示式的一組觀察結果,所有可以把相關的變數組合在一起,以便訪問。
除了這些watch視窗外,還有乙個快速監視視窗,它能快速提供源**中某個變數的詳細資訊。要使用這個視窗,可以右擊要檢視的變數,選擇快速監視選單選項。
監視視窗的乙個要點是,它們可以在應用程式的各個執行過程之間保留下來。如果中斷程式,再重新執行,就不必再次新增監視視窗了,vs會記住上次使用的watch視窗。
3、單步執行**
進入中斷模式後,在**檢視的左邊,正在執行的**旁邊會出現乙個游標(如果使用斷點進入中斷模式,該指標最初應顯示在斷點的紅色圈內)。在這個位置上,可以選擇逐行執行。
step info --執行並移動到下乙個要執行的語句上。
step over -- 同上,但並不進入巢狀的**塊,包括函式。
4、書籤視窗和命令視窗
命令視窗和書籤視窗(選擇檢視|其他視窗選單)可以在執行應用程式的過程中執行命令。通過命令視窗可以手動執行vs操作(例如選單和工具欄操作),書籤視窗可以執行源**,計算表示式,還可以執行其他**。
這些視窗在內部是鏈結在一起的。甚至可以在它們之間切換:輸入命令immed,可以從命名視窗切換到書籤視窗,輸入》cmd可以從書籤視窗切換到命令視窗。
這個視窗最簡單的用法是計算表示式,有的像監視視窗「one shot」。為此,只需輸入乙個表示式,並按回車鍵即可。接著就會顯示請求的資訊。也可以修改變數的內容。
在大多數情況下,使用前面介紹的變數監視視窗更容易得到相同的結果,但這個技巧對於常常發生變化的變數值仍很方便,也適合測試以後不感興趣的表示式。
5、呼叫堆疊視窗
呼叫堆疊視窗描述了程式是如何執行到當前位置的。簡言之,該視窗顯示了當前函式、呼叫它的函式,以及呼叫函式的函式(即乙個巢狀的函式呼叫列表)。呼叫的位置也被記錄下來。
如果雙擊某一項,就會移動到相應的位置,跟蹤**執行到當前位置的過程。
在第一檢測錯誤時,這個視窗非常有用,因為它們可以用來檢視錯誤發生前的情況。對於常用函式中出現的錯誤,它有助於找到錯誤的源頭。
【注意】
有時這個視窗會顯示一些非常雜亂的資訊,例如有時因為以錯誤的方式使用了外部函式,錯誤在應用程式的外部發生,就會出現這種情況。如果需要,可以右擊該視窗,選擇外部**,檢視外部引用。
VS中多程序除錯如何除錯?
首先建立的程序肯定有乙個入口點,那麼再這個入口點新增乙個暫停 睡眠 模態對話方塊等操作,這樣,新的程序啟動的時候就會再這裡停止,這樣再使用附加程序操作就可以了。當然有人會說,如果程序是由於第三方庫建立的呢,我無法改變入口函式怎麼辦?那麼肯定也有辦法,例如cef庫,多程序的瀏覽器,啟動的時候,也是建立...
gdb 除錯 vs除錯
一 先要生成二進位制檔案 g g 1.cpp o 1.out g引數不要省,不然 gdb l 引數用不了 二 引數 設定斷點 設定 函式斷點break func 在某行設定斷點break 7 檢視斷點資訊 info break 刪除斷點 d 刪除所有斷點 d 3 刪除第三個 執行 r 下一步 n 逐...
VS除錯技巧
介紹 除錯是軟體開發周期中的乙個很重要的部分,有時很有挑戰性,有時候則讓程式設計師迷惑,有時候讓程式設計師發瘋,但是。可以肯定的是,對於任何不是太那個微不足道的程式來說,除錯是不可避免的。近年來,除錯工具的發展已經使得很多除錯任務簡單省時了。本文總結了十個除錯技巧,當你使用vs的時候可以節省你很多時...