?
目錄
使用環境:Visual Studio 2022,如無特殊說明,都是在Debug、x64環境下編譯
一.什么是BUG
二.調試快捷鍵
F9:創建斷電或取消斷點
?條件斷點:滿足這個條件才觸發
?F5:啟動調試,經常?來直接跳到下?個斷點處,?般是和F9配合使?。
CTRL+F5:開始執?不調試,如果你想讓程序直接運?起來?不調試就可以直接使?。
?F10:逐過程,通常?來處理?個過程,?個過程可以是?次函數調?,或者是?條語句。
F11:逐語句,就是每次都執??條語句,但是這個快捷鍵可以使我們的執?邏輯進?函數內部。在函 數調?的地?,想進?函數觀察細節,必須使?F11,如果使?F10,直接完成函數調?。
?三.監視和內存觀察
3.1監視
特別注意:形參調用數組?編輯
?3.2內存
?四.Debug和Release
? 五.分析一個有意思的代碼
六.編程常?錯誤歸類
6.1編譯型錯誤
6.2鏈接型錯誤?
?編輯?6.3運?時錯誤
使用環境:Visual Studio 2022,如無特殊說明,都是在Debug、x64環境下編譯
一.什么是BUG
簡單的說就是因為各種原因,語法原因或運行成功,但結果有差異等。
二.調試快捷鍵
F9:創建斷電或取消斷點
斷點的作?是可以在程序的任意位置設置斷點,打上斷點就可以使得程序執?到想要的位置暫定執 ?,接下來我們就可以使?F10,F11這些快捷鍵,觀察代碼的執?細節。
?條件斷點:滿足這個條件才觸發
第一步:設置斷點后,鼠標右擊紅色斷電標記,點擊條件
第二步:根據需求,選擇條件輸入條件
已i==5為列:
按快捷鍵F5,效果:?
?F5:啟動調試,經常?來直接跳到下?個斷點處,?般是和F9配合使?。
CTRL+F5:開始執?不調試,如果你想讓程序直接運?起來?不調試就可以直接使?。
?F10:逐過程,通常?來處理?個過程,?個過程可以是?次函數調?,或者是?條語句。
F11:逐語句,就是每次都執??條語句,但是這個快捷鍵可以使我們的執?邏輯進?函數內部。在函 數調?的地?,想進?函數觀察細節,必須使?F11,如果使?F10,直接完成函數調?。
?VS更多快捷鍵了解:http://blog.csdn.net/mrlisky/article/details/72622009
?三.監視和內存觀察
3.1監視
監視調用方法:
隨后彈出:
在此添加想要觀察的變量名,數組名等
注意:變量在程序步驟中還未創建時,監視會有報錯
不用急,只是因為程序還未執行到創建變量的步驟,根據需求按F10或者F11執行創建語句后就可觀察
特別注意:形參調用數組
可以看到,在main函數里時,數組可以看到所有元素,但是到了test1函數里時,觀察形參數組只能看到首位元素了。
再看,如果調用二維數組
arr2[3][5]; 三行五列的數組,也只能觀察到第一行數組.
其原因是:數組的傳參是,傳的數組首元素的地址,還和編譯器有關
想要看到,除首元素外的其他元素,其實只需要,特定的輸出方式
輸入格式是:
數組名,元素個數(二維數組也可以理解為行數)
列:
arr1,10
arr2,3
?3.2內存
步驟:
內存更加方便我們觀察數據,更利于對代碼后面執行內存的理解
?四.Debug和Release
在VS上編寫代碼的時候,就能看到有 debug 和 release 兩個選項,分別是什么意思呢?
Debug通常稱為調試版本,它包含調試信息,并且不作任何優化,便于程序員調試程序; 程序員在寫代碼的時候,需要經常性的調試代碼,就將這?設置為 debug ,這樣編譯產?的是 debug版本的可執?程序,其中包含調試信息,是可以直接調試的。
Release 稱為發布版本,它往往是進?了各種優化,使得程序在代碼??和運?速度上都是最優的, 以便??很好地使?。當程序員寫完代碼,測試再對程序進?測試,直到程序的質量符合交付給?? 使?的標準,這個時候就會設置為 release ,編譯產?的就是 release 版本的可執?程序,這個 版本是??使?的,?需包含調試信息等。?
?對比:
對?可以看到從同?段代碼,編譯?成的可執??件的??,release版本明顯要?,?debug版本明 顯?。編譯器對Release版本,進行了優化處理
? 五.分析一個有意思的代碼
此代碼,需要特定的環境:
在VS2022、X86、Debug的環境下,編譯器不做任何優化的話,下?代碼執?的結果是啥?
#include <stdio.h>int main(){int i = 0;int arr[10] = {0};for(i=0; i<=12; i++){arr[i] = 0;printf("hehe\n");}return 0;}
看代碼先給出你的答案!!!!!
看代碼先給出你的答案!!!!!
看代碼先給出你的答案!!!!!
看代碼先給出你的答案!!!!!
看代碼先給出你的答案!!!!!
看代碼先給出你的答案!!!!!
相信大家大部分人可能都是覺得,只是越界訪問。
那么我們看運行效果:
哎!居然沒有警告,而且在無限次的打印代碼,當時我看到這個結果引起了我強烈的好奇心
這?肯定有疑問:為什么i和arr 數組之間恰好空出來2個整型的空間呢?這?確實是巧合,在不同的編譯器下可能中間的空出的空間??是不 ?樣的,代碼中這些變量內存的分配 和地址分配是編譯器指定的,所以的 不同的編譯器之間就有差異了。所以 這個題?是和環境相關的。
從這個理解我們能夠體會到調試的重要性,只有調試才能觀察到程序內部執?的細節,就像醫?給病 ?做B超,CT?樣。
?并且,有一個公司也出了這樣一個面試題:
?那么如果沒有了解相關知識,那么面試官肯定就不會在你試卷上想要的答案了!!!
六.編程常?錯誤歸類
6.1編譯型錯誤
編譯型錯誤?般都是語法錯誤,這類錯誤?般看錯誤信息就能找到?些蛛絲?跡的,雙擊錯誤信息也 能初步的跳轉到代碼錯誤的地?或者附近。編譯錯誤,隨著語?的熟練掌握,會越來越少,也容易解 決。
6.2鏈接型錯誤?
看錯誤提?信息,主要在代碼中找到錯誤信息中的標識符,然后定位問題所在。?般是因為
- 標識符名不存在
- 拼寫錯誤
- 沒包含頭文件
- 引用的庫不存在
?6.3運?時錯誤
運?時錯誤,是最恐怖的,明明可以運行成功,但有時候就不是你想要的效果。甚至定時出現,那可能就是在吃內存,內存沒了程序就崩掉了
你們的點贊、關注、收場是博主最大的動力!求三連