【C語言】實(shí)用調(diào)試技巧-創(chuàng)新互聯(lián)

目錄

成都創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比斗門網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式斗門網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋斗門地區(qū)。費(fèi)用合理售后完善,十多年實(shí)體公司更值得信賴。

什么是Bug

什么是調(diào)試

Debug與Release的區(qū)別

如何調(diào)試

const的作用


作為準(zhǔn)程序員,我們也敲了不少行代碼,曾幾何時(shí),為了錯誤絞盡腦汁,為了bug哭天喊地。說到bug,背后有什么有趣的故事,如何規(guī)避bug呢??這篇文章讓你了解何為調(diào)試,如何調(diào)試,一起來看下去吧~

什么是Bug

bug,英文意思為昆蟲或臭蟲,看名字就知道人們對它有多深惡痛絕了。歷史上第一個(gè)bug是由一只飛蛾引起的(也算是雖死猶生,名流千古了哈哈)。在編程中就是指程序錯誤。

什么是調(diào)試

調(diào)試英文名為debugging(或debug),又稱除錯,是發(fā)現(xiàn)和減少計(jì)算機(jī)程序或電子儀器設(shè)備中程序錯誤的過程。

對freshman來說,一個(gè)工程中80%的時(shí)間在敲代碼,20%的時(shí)間在調(diào)試;而對高手來說,20%敲代碼,80%調(diào)試。俗話說得好,一名優(yōu)秀的程序員就是一名優(yōu)秀的偵探,與bug斗智斗勇的過程就是調(diào)試。

Debug與Release的區(qū)別

Debug 通常稱為調(diào)試版本,它包含調(diào)試信息,并且不作任何優(yōu)化,便于程序員調(diào)試程序。
Release 稱為發(fā)布版本,它往往是進(jìn)行了各種優(yōu)化,使得程序在代碼大小和運(yùn)行速度上都是最優(yōu)的,以便用戶很好地用。

Debug和Release版本下代碼結(jié)果和反匯編等等都是不一樣的。

這里舉個(gè)小栗子,來看看編譯器是怎么區(qū)別對待Debug和Release的。

#define _CRT_SECURE_NO_WARNINGS
#includeint main()
{
    int i = 0;
    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
    for (i = 0; i<= 12; i++)
    {
        arr[i] = 0;
        printf("hello world\n");
    }
    return 0;
}

我們可以看見,如果是 debug 模式去編譯,程序的結(jié)果是死循環(huán),程序崩潰了; 而如果是 release 模式去編譯,程序沒有死循環(huán)。這便是優(yōu)化導(dǎo)致的結(jié)果。

在Debug環(huán)境下,代碼詳細(xì)運(yùn)行過程如下:

調(diào)試時(shí)打開監(jiān)視窗口,如下:

當(dāng) i 越界訪問到 arr [12] 時(shí),本該和arr [10],arr [11] 一樣,將arr [12] 改為0,湊巧的是,i 的地址和arr [12] 的地址是同一空間,arr [12]里放的數(shù)組就恰好等于 i 的值,都是12,在arr [12] 被改為0時(shí),i 的值也變?yōu)?,然后0<= 12,滿足循環(huán)條件,每當(dāng) i = 12后就會被改為0,這樣?i 永遠(yuǎn)到達(dá)不了13,程序也就陷入了死循環(huán)。

這確實(shí)是巧合,但又確實(shí)存在,可這又是為什么呢?這里我們通過畫圖的方式來解釋:

該代碼僅在VS2019 X86 的環(huán)境下使用,其他情況不一定,不用在此糾結(jié),給出這個(gè)例子是想告訴我們調(diào)試的重要性,摸不著頭腦時(shí)調(diào)試可以有效解決問題哦~

如何調(diào)試

1.環(huán)境準(zhǔn)備:

將編譯器切換到Debug版本下,Release版本不可調(diào)試。

2.快捷鍵:

F5 :啟動調(diào)試,經(jīng)常用來直接跳到下一個(gè)斷點(diǎn)處。

F9 :創(chuàng)建斷點(diǎn)和取消斷點(diǎn)

F10 :逐過程,不可進(jìn)入函數(shù)

F11 :逐語句,每次都執(zhí)行一條語句,可以進(jìn)入函數(shù)內(nèi)部

CTRL + F5 :開始執(zhí)行不調(diào)試

以上就是最常用的快捷鍵啦,當(dāng)然還有許多許多,可以看看這個(gè)博主的VS中常見的快捷鍵,總結(jié)的很詳細(xì)哦~

3.查看信息:

注意注意注意,以下查看都是在已經(jīng)開始調(diào)試的條件下才有的,沒有調(diào)試看不見?。?!

①臨時(shí)變量:調(diào)試——窗口——監(jiān)視——任選其一

如果選了監(jiān)視底下的自動窗口,編譯器會自動識別程序的臨時(shí)變量并監(jiān)視,雖然很方便,但不一定是我們想要監(jiān)視的量,比如進(jìn)入函數(shù)后函數(shù)外的臨時(shí)變量就沒辦法監(jiān)視了,有一定的局限性,不建議使用。

②內(nèi)存:調(diào)試——窗口——內(nèi)存——任選其一

③堆棧:調(diào)試——窗口——調(diào)用堆棧

調(diào)用堆??梢郧逦姆磻?yīng)函數(shù)的調(diào)用關(guān)系以及當(dāng)前調(diào)用所處的位置

④反匯編:法一:鼠標(biāo)右鍵——轉(zhuǎn)到反匯編

法二:調(diào)試——窗口——反匯編

寄存器:調(diào)試——窗口——寄存器

常見的 coding 技巧: 1. 使用 assert; 2. 盡量使用 const; 3. 養(yǎng)成良好的編碼風(fēng)格; 4. 添加必要的注釋; 5. 避免編碼的陷阱。 const的作用
const *p? ?and? * const p 1. const如果放在 * 的左邊,修飾的是指針指向的內(nèi)容,保證指針指向的內(nèi)容不能通過指針來改變。但是指針變量本身的內(nèi)容可變。 2. const如果放在 * 的右邊,修飾的是指針變量本身,保證了指針變量的內(nèi)容不能修改,但是指針指向的內(nèi)容,可以通過指針改變。
int main()
{
	int a = 10;
	int b = 20;

	int* const p = &a;
	*p = &b;//ok
	p = 20;//err

	const int *p = &a;
	*p = &b;//err
	p = 20;//ok

	return 0;
}

常見錯誤:編譯型錯誤,鏈接型錯誤,運(yùn)行時(shí)錯誤

面對Bug,我們要做的就是做一個(gè)有心人,積累排錯經(jīng)驗(yàn)。代碼會越寫越熟練,我們找錯的能力也會越來越高,Bug不是絆腳石,而是成長的必經(jīng)之路。相信在若干年后,我們會感謝曾經(jīng)寫過的Bug(強(qiáng)行煽情了屬于是,我才不感謝呢(bushi? ),繼續(xù)和它們斗智斗勇吧??!

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

分享文章:【C語言】實(shí)用調(diào)試技巧-創(chuàng)新互聯(lián)
URL標(biāo)題:http://muchs.cn/article22/pscjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、品牌網(wǎng)站制作、動態(tài)網(wǎng)站、企業(yè)網(wǎng)站制作、定制網(wǎng)站移動網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)