VS中的除錯

2021-08-25 09:31:07 字數 4598 閱讀 1600

除錯程式中包含了應用程式的符號資訊。符號資訊意味著跟蹤(例如)未編譯**中使用的變數名,這樣,它們就可以匹配已編譯的機器碼應用程式中現有的值。符號資訊包含在.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的時候可以節省你很多時...