1.什么是bug?
談到bug,我們知道bug的中文意思是蟲子,飛蛾的意思。至于為什么bug一詞會用到計算機領(lǐng)域的話得追溯到第一臺計算機的誕生。
上面?zhèn)€你看到的就是世界上第一個bug的誕生。它的來源也是非常的有意思,當(dāng)時世界上的第一臺計算機出了故障不能正常的工作,于是工作人員就進入計算機內(nèi)部檢查(當(dāng)時的計算機非常的大,達到人可以進去),這個時候發(fā)現(xiàn)計算機的一個晶體管內(nèi)有個飛蛾死在了里面于是把飛蛾清理干凈,換了零件之后,計算機就可以正常的工作了。于是科學(xué)家們就把此次事件記錄了下來,一直延伸到現(xiàn)在,我們就把計算機成程序出問題說成是bug。
2.調(diào)試是什么?有多重要?
調(diào)試(英語:Debugging / Debug),又稱除錯,是發(fā)現(xiàn)和減少計算機程序或電子儀器設(shè)備中程序
錯誤的一個過程。
簡單點說調(diào)試就是一個發(fā)現(xiàn)錯誤,并且精準的找到錯誤地點,找到合理的解決方案的一個糾錯過程。
在程序員界里有這樣一句話:一個優(yōu)秀的程序員同時也是一個優(yōu)秀的偵探。
- 調(diào)試的基本步驟:
1.發(fā)現(xiàn)程序錯誤的存在
2.以隔離、消除等方式對錯誤進行定位
3.確定錯誤產(chǎn)生的原因
4.提出糾正錯誤的解決辦法
5.對程序錯誤予以改正,重新測試
3.debug和release的介紹。
- Debug 通常稱為調(diào)試版本,
它包含調(diào)試信息,并且不作任何優(yōu)化
,便于程序員調(diào)試程序。 - Release 稱為發(fā)布版本,
它往往是進行了各種優(yōu)化,使得程序在代碼大小和運行速度上都是最優(yōu) 的
,以便用戶很好地使用。
當(dāng)然兩個版本還是有一些的不同之處的,就比如生成的可執(zhí)行文件的大小是不一樣的(.exe文件后綴名的文件);
我們先看Debug版本的:
再看Release版本的:
-
這樣一對比就可以看出了Release版本的可執(zhí)行文件的大小是比Debug版本的小的,這是因為Release版本是對代碼做了一些優(yōu)化的,而我們的Debug版本是沒有做優(yōu)化的,所以在Release版本下的文件所占內(nèi)存大小是更小的。
-
那問題來了,既然有兩個版本我們應(yīng)該選擇哪個版本呢?
首先我們知道這兩個版本的區(qū)別就是一個做了優(yōu)化一個沒有做優(yōu)化。
那既然我們要檢查我們編寫的代碼哪里出問題了,是不是應(yīng)該我們寫的什么代碼就調(diào)試什么代碼,也就是說沒有做任何的優(yōu)化效果,這樣的話及時是一點小錯誤我們也可以即使的發(fā)現(xiàn)并作出及時的改進。所以我們調(diào)試首選的就是Debug版本的。 -
相反的,如果我們調(diào)試用的是Release版本的話,我們知道Release版本是對我們寫的代碼進行了優(yōu)化作用的,如果我們用這個版本進行調(diào)試的話,有些錯誤的代碼時被優(yōu)化過的,那就說明一些較小的錯誤是不能被發(fā)現(xiàn)的,那么日積月累把這些小錯誤累計起來就會出大錯誤的。這么講的話那Release版本到底在什么時候用到呢。我們要知道一點的時我們編寫出來的文件終歸是要給客戶使用的,既然時給別人用的我們就要保證我們編寫的程序不能出現(xiàn)錯誤,這個時候Release版本就有用出來,當(dāng)我們調(diào)試的時候一些小的錯誤沒有及時的發(fā)現(xiàn)就直接給用戶使用,這個時候我么Release版本就會幫我們優(yōu)化代碼彌補那些小錯誤,這個時候客戶就能正常的時候了。
4.windows環(huán)境調(diào)試介紹。
4.1常見調(diào)試快捷鍵
使用一些常用調(diào)試快捷鍵: | 快捷鍵作用 |
---|---|
F5 | 啟動調(diào)試,經(jīng)常用來直接跳到下一個斷點處。 |
F9 | 創(chuàng)建斷點和取消斷點斷點的重要作用,可以在程序的任意位置設(shè)置斷點。這樣就可以使得程序在想要的位置隨意停止執(zhí)行,繼而一步步執(zhí)行下去。 |
F10 | 逐過程,通常用來處理一個過程,一個過程可以是一次函數(shù)調(diào)用,或者是一條語句。 |
F11 | 逐語句,就是每次都執(zhí)行一條語句,但是這個快捷鍵可以使我們的執(zhí)行邏輯進入函數(shù)內(nèi)部(這是最長用的)。 |
CTRL+F5 | 開始執(zhí)行不調(diào)試,如果你想讓程序直接運行起來而不調(diào)試就可以直接使用。 |
- CTRL+F5 直接執(zhí)行
我們代碼后,想要直接看到我們編寫的結(jié)果,就用這個組合鍵,就能在終端看到我們的編寫結(jié)果了。這個是可以跳過斷點的。 - F10逐步調(diào)試
萬一我們代碼編寫的時候出現(xiàn)了錯誤,我們也很難看出哪里出錯了,這個時候就需要對我們的代碼逐行的進行檢驗,這個時候我們就可以按F10 - F5 時執(zhí)行鍵
這個一般和F9斷點搭配的使用,當(dāng)我們設(shè)置好了斷點之后,只需要按F5便會跳到斷點處。 - F9 設(shè)計斷點
但我們編寫的代碼又幾百行甚至更多的時候,而我們又知道他在那個部分出錯了,如果我們還按F10逐行的進行檢驗的話就會浪費大量的時間和精力,這個時候我們可以設(shè)計斷點。設(shè)計斷點的方法有兩種:1.選中一行按F9 。2.用鼠標左鍵點擊改行最左邊。當(dāng)我們設(shè)置好了斷點之后再按F5就可以直接跳到我們的斷點處了。
4.2 調(diào)試的時候查看程序當(dāng)前信息
一般我們使用到的有:注意這些都是在進行調(diào)試的時候才能使用的
4.2.1監(jiān)視:
這個監(jiān)視窗口我們可以自主輸入想要看到結(jié)果,在按F10的過程最左邊有一個箭頭,這個箭頭就是我們執(zhí)行到哪一行的標志。
同時除了手動的,還用自動的。
自動窗口會根據(jù)你調(diào)試到哪里自動生成可監(jiān)視的變量,但是他的局限性就是不能一直監(jiān)視,一點過來變量的作用域就不能在監(jiān)視了。
4.2.2內(nèi)存
監(jiān)視內(nèi)存的方法和上面是一樣的:
它可以顯示處變量子內(nèi)存的分布。
4.2.3調(diào)用堆棧
4.2.4反匯編
調(diào)用堆棧的方法有兩種:1.鼠標右鍵點擊轉(zhuǎn)到反匯編。2.窗口打開
4.2.5寄存器
5.一些調(diào)試的實例。
實例一:
#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;
}
按我們的分析,這是一個數(shù)組訪問越界問題。
我們先看Debug版本的:
這里發(fā)現(xiàn)程序進入死循環(huán)了(這里提示以下要改成x86狀態(tài)下才能看到死循環(huán)的效果,如果時x64的話就會直接報錯)這是為什么呢?
這個時候我我們就要明白有關(guān)內(nèi)存問題了:
我們的內(nèi)存分為棧區(qū),堆區(qū),靜態(tài)區(qū)(后面都會詳細的講解),而我們主函數(shù)調(diào)用時在棧區(qū)的。
棧區(qū)的特點是:1.先使用高地址的空間,在使用低地址的處的空間。2.先進的后出,后進的先出。
我們看一下他們的匯編:
這里我們可以看到i的內(nèi)存和arr[12]的內(nèi)存地址重合了,也就說明當(dāng)我們遍歷到arr[12]并把arr[12]初始化為0的時候使用過地址改變arr[12]的,恰好我們i的地址也是arr[12]的地址,所以i就別改成了0,所以一旦i遍歷到12的時候就有被改成了0,所以i又再次遍歷,一直這樣重復(fù)所以就會死循環(huán)。
那我們再看一下Release版本的:
會發(fā)現(xiàn)它就整整齊齊的打印了13個hehe,這就是Release版本的優(yōu)化作用。
6.如何寫出好(易于調(diào)試)的代碼。
優(yōu)秀的代碼:
- 代碼運行正常
- bug很少
- 效率高
- 可讀性高
- 可維護性高
- 注釋清晰
- 文檔齊全
常見的coding技巧:文章來源:http://www.zghlxwxcb.cn/news/detail-452056.html
- 使用assert
- 盡量使用const30. 養(yǎng)成良好的編碼風(fēng)格
- 添加必要的注釋
- 避免編碼的陷阱。
注意:文章來源地址http://www.zghlxwxcb.cn/news/detail-452056.html
- 分析參數(shù)的設(shè)計(命名,類型),返回值類型的設(shè)計
- 這里講解野指針,空指針的危害。
- assert的使用,這里介紹assert的作用
- 參數(shù)部分 const 的使用,這里講解const修飾指針的作用
- 注釋的添加
7.編程常見的錯誤。
- 編譯型錯誤
直接看錯誤提示信息(雙擊),解決問題?;蛘邞{借經(jīng)驗就可以搞定。相對來說簡單。 - 鏈接型錯誤
看錯誤提示信息,主要在代碼中找到錯誤信息中的標識符,然后定位問題所在。一般是標識符名不
存在或者拼寫錯誤。 - 運行時錯誤
借助調(diào)試,逐步定位問題。最難搞。
到了這里,關(guān)于你真的知道怎么使用vs嗎?把把手教你實用調(diào)試小技巧的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!