国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

[C語言—調試技巧]

chengtao1633 / 1011人閱讀

摘要:臭蟲中文常稱為缺陷。與相對應,人們將發現并加以糾正的過程叫做中文稱作調試,意即捉蟲子或殺蟲子。于是,霍珀詼諧的把程序故障統稱為臭蟲,把排除程序故障叫,而這奇怪的稱呼,后來成為計算機領域的專業行話。

各位小伙伴們大家好,我是澤奀( ̄o ̄) . 相信大家在編寫C程序中會遇到很多代碼的Bug.所以本篇博客就帶大家如何調試C的技巧,這樣在遇到有錯誤的代碼,也不必驚慌,只需調試下,Bug就再也不會存在了哈哈哈~隔。?

?目錄

?什么是bug??

?臭蟲:

?什么是調試?

?調試的基本步驟

?Debug和Release

?Debug:

?Release:

?本質區別:

?Debug 版本:

?Release 版本:

?Release版本優化:

?運行與調試常用的快捷鍵?

?查看程序的信息

?如何寫出好的代碼?

?優秀的代碼

?常見的coding技巧?

?assert代碼使用:


什么是bug??

bug:Bug的原意:可以稱之為“臭蟲",現在指代的是漏洞,就是在安全系統上出現缺陷,攻擊者可以對未授權的情況下進行攻擊,Bug(計算機漏洞) 可以形容在各個領域范圍之內所出現的漏洞。

?臭蟲:

  • 中文常稱BUG為“缺陷”。而且,“缺陷”一詞更能反映事情的本質。因為“臭蟲”是從外面飛進去的,并非程序本身有問題。而程序本身存在的問題,是程序原來就具有的。因此,在這里將BUG翻譯為“系統漏洞”更合適。

由來:第一代的計算機是由許多龐大且昂貴的真空管組成,并利用大量的電力來使真空管發光。可能正是由于計算機運行產生的光和熱,引得一只小蟲子(Bug)鉆進了一支真空管內,導致整個計算機無法正常工作。研究人員費了半天時間,總算發現原因所在,把這只小蟲子從真空管中取出后,計算機又恢復正常。后來,Bug這個名詞就沿用下來,用來表示電腦系統或程序中隱藏的錯誤、缺陷、漏洞等問題。

1945年,計算機還是由機械式繼電器和真空管驅動的,機器有房間那么大。體現當時技術水平的MarkⅡ,是由哈佛大學制造的一個龐然大物。當技術人員正在進行不整機運行時,它突然停止了工作。他們爬上去找原因,發現這臺巨大的計算機內部一組繼電器的觸點之間有一只飛蛾,這顯然是由于飛蛾受光和熱的吸引,飛到了觸點上,然后被高電壓擊死。與Bug相對應,人們將發現Bug并加以糾正的過程叫做“Debug”(中文稱作“調試”),意即“捉蟲子”或“殺蟲子”


什么是調試?

調試其實就是找出bug,計算機有bug一定是你程序的問題。所有發生的程序的問題都是有跡可循的,我們只需要順藤摸瓜最后一步步解決。

一名優秀的程序員,必然是一名優秀的偵探。每一次的調試其實就是破案的過程。

調試:英文DeBug,又稱作是除錯,是發現和減少計算機程序設備中和電子儀器錯誤的過程。

調試的基本步驟

  • 發現程序的錯誤所在:?
  1. 程序員(寫程序)
  2. 軟件測試人員(測試程序的重要性)
  3. 用戶/玩家

代價最小的是程序員,代價最大的是用戶。

  • 以隔離消除的方式對錯誤進行定義
  • 確定錯誤的產生
  • 提出糾正的錯誤方法
  • 對程序的錯誤給予改正,并且改正完之后進行重新的修正

Debug和Release

Debug:

通常為調試版本,它包含的調試信息,并且不會做進行任何的優化,便于程序員的調試信息。

概念:

1937年,美國青年霍華德·艾肯找到IBM公司為其投資200萬美元研制計算機,第一臺成品艾肯把它取名為:馬克1號(mark1),又叫“自動序列受控計算機”,從這時起IBM公司由生產制表機,肉鋪磅秤,咖啡研磨機等亂七八糟玩意兒行業,正式跨進“計算機”領地。為馬克1號編制程序的是哈佛的一位女數學家格蕾絲·霍珀,有一天,她在調試程序時出現故障,拆開繼電器后,發現有只飛蛾被夾扁在觸點中間,從而“卡”住了機器的運行。于是,霍珀詼諧的把程序故障統稱為“臭蟲.............(BUG)”,把排除程序故障叫DEBUG,而這奇怪的“稱呼”,后來成為計算機領域的專業行話。從而debug意為排除程序故障的意思。

Release:

稱之為發布版本,它往往是根據各種進行了優化,使得程序的代碼都是最佳優的,以便讓用戶更好的去使用。

本質區別:

Debug和Release編譯方式的本質區別

Debug 通常稱為調試版本,它包含調試信息并且不作任何優化,便于程序員調試程序

Release 稱為發布版本,它往往是進行了各種優化,使得程序在代碼大小和運行速度上都是最優的,以便用戶很好地使用。還有大小的區別,因為Debug的版本是可以進行調試的(包含了相應的調試信息),而Release版本是不能進行調試的。

Debug 和 Release 的真正秘密,在于一組編譯選項。

下面列出了分別針對二者的選項

(當然除此之外還有其他一些,如/Fd /Fo,但區別并不重要,通常他們也不會引起 Release 版錯誤,在此不討論)

Debug 版本:

/MDd /MLd 或 /MTd 使用 Debug runtime library(調試版本的運行時刻函數庫)

/Od 關閉優化開關

/D "_DEBUG " 相當于 #define _DEBUG,打開編譯調試代碼開關(主要針對 assert函數)

/ZI 創建 Edit and continue(編輯繼續)數據庫,這樣在調試過 程中如果修改了源代碼不需重新編譯 /GZ 可以幫助捕獲內存錯誤

/Gm 打開最小化重鏈接開關,減少鏈接時間

Release 版本:

/MD /ML 或 /MT 使用發布版本的運行時刻函數庫

/O1 或 /O2 優化開關,使程序最小或最快

/D "NDEBUG " 關閉條件編譯調試代碼開關(即不編譯assert函數)

/GF 合并重復的字符串,并將字符串常量放到只讀內存,防止 被修改

實際上,Debug 和 Release 并沒有本質的界限,他們只是一組編譯選項的集合,編譯器只是按照預定的選項行動。事實上,我們甚至可以修改這些選項,從而得到優化過的調試版本或是帶跟蹤語句的發布版本。

  • 采用Debug的話,如果用Debug代碼來編譯可執行程序的話,我們也會產生一個Debug的版本的一個可執行程序
  • 采用Release的話,就是發布版本,可執行的程序。——(簡化)

Release版本優化:

#include#includeint main(void){    int i = 0;    int arr[10] = {1,2,3,4,5,6,7,8,9,10};    for(i=0;i<=12;i++)    {        printf("hello C/n");        arr[i] = 0;    }    system("pause");}

大家可以分別試一下就會發現不同之處了,分別用Debug和Release運行以下程序。這里是當你for循環的結果為假的時候,它的i又會重置為0,然后一直這個樣子重復循環打印for語句的循環內容。因為arr這里跟i它們兩個人是同一塊空間,那么當你改變arr[i]的時候int i也會改變。因為它們的地址是一樣的,所以才會改變。

由于這個程序涉及范圍到棧區一些相關的知識點的內容,在這里我跟大家簡單的說下。

棧區:棧區的默認使用是先使用高地址處的空間,然后在使用低地址處的空間。數組的下標隨著增長,地址是由低到高變化的。當然如果你在不同的編譯器上運行它的死循環的位置可能不同。你們也可以在不同的編譯器上運行一下對比一下


運行與調試常用的快捷鍵?

運行:Ctrl + F11

使用快捷鍵Ctrl + F11可以快速運行當前選中的資源文件。

調試:F11:是逐步 它是會進入函數的 把程序細化到步

shift + F11,跳出函數

F10 是逐行 在某條語句調用一個函數的時候 它不會進入(除非那里設有斷點)

F9:切換斷點

使用快捷鍵F11可以快速調試當前選中的資源文件。

斷點調試操作:F5、F6、F7、F8

F5和F9的快捷鍵可以進行配合使用。

在斷點調試時,快捷鍵F6是執行下一步(單步跳過);F5是執行當前調用內部細節步驟的下一步(單步跳入);F7是跳過方法內部的執行步驟,直接返回到方法外的下一步(單步返回);F8是跳出斷點調試(跳過調試,繼續執行代碼,在下一個斷點處暫停再次進入斷點調試)。


查看程序的信息

ctrl + F5:開始執行不調試,如果你想讓程序而不調試就可以進行使用。

自動窗口:當我們程序在執行中的時候,打開自動窗口,自動的把某些程序的上下文變量自動給你觀察,這就是自動窗口的功能。

局部變量:和自動窗口差不多其實,但是它有一個缺點是它不能想監視誰就監視誰。

監視:監視這個作用就比較好了,當你想監視的話就輸入那個變量的值,它就會呈現在你的監視當中,這樣你就可以隨時隨地的去進行觀察那個變量了。(監視窗口可以說是博主用的最多的了)

內存:如果我們想進行觀察當前程序執行的內存的話,這個時候就是你輸入觀察的內存信息了。

(內存窗口也是用的可以說是非常多的了)

調用堆棧:在這里簡單的和各位小伙伴們說下,像棧一樣的邏輯給大家給展示出來它的一個邏輯,頂上往前放數據再往頂上出數據,可以很好反饋程序當中的代碼的調棧的調用邏輯。

初學者掌握調試的內容可以達到事半功倍的效果,多多使用調試可以提高程序執行代碼的效率。


如何寫出好的代碼?

優秀的代碼

  • 代碼整潔且規范
  • 注釋清晰,且通俗易懂(代指寫代碼的人)
  • 可讀性,有效性,可維護性
  • bug盡量能夠達到自己能夠預期的范圍之內,就是bug少,或者幾乎沒有bug
  • 文檔齊全,不亂去堆放?

常見的coding技巧?

  • 養成良好的編碼風格
  • 注釋必要的還是要去添加,提高代碼的可讀性
  • 避免編碼的陷阱
  • 盡量使用const
  • 使用assert,頭文件#include,在assert();里面的表達式如果為真的話,assert表達式為真就什么都不會發生,如果assert的表達式為假,那么就會報錯。

在這里簡單的跟大家介紹一下const的關鍵字:const修飾的數據是常類型,常類型的變量或者對象的值是不可以被該變的,也就是被它修飾過的是常量,相比之下const常量和#define是有點類似的,但是在我們用數組的時候還是要區分一下,因為數組里面 [常量表達式]此時我如果 const int n = 10 假設賦值給arr數組,int arr[n] = {0};結果是不行的,雖然加了const關鍵字,但實際上也只是變量只不過是不能被修改的變量。那么如果我們這里用的是#define—定義符號常量就可以了。??

assert代碼使用:

#include#includeint My_strlen(const char* pb){	int Count = 0;//計數	assert(*pb != NULL);//保證指針的有效性 NULL —— 空指針	while (*pb != "/0")	{		Count++;		*pb++;	}	return Count;}int main(void){	char arr[20] = "nihao C";	int ret = My_strlen(arr);	printf("arr(strlen) = %d/n", ret);	return 0;}

最后,我想跟大家說程序遇到bug不要害怕,勇敢的去面對它吧,加油奧里給!

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/121140.html

相關文章

  • C語言基礎】實用調試技巧

    摘要:調試的基本步驟發現程序錯誤的存在以隔離消除等方式對錯誤進行定位確定錯誤產生的原因提出糾正錯誤的解決辦法對程序錯誤予以改正重新測試和版本的介紹通常稱為調試版本,它包含調試信息,并且不做任何優化,以便于程序員調試。 ...

    lsxiao 評論0 收藏0
  • Chrome 調試技巧

    摘要:而就是告訴程序在那里停下來進行單步調試,俗稱斷點。面向,專為異步而生的斷點調試功能。中的調試技巧元素的控制臺書簽開發者工具和都提供了書簽功能,用于顯示你在元素標簽頁或標簽頁中最后點擊的元素。 寫在前面本文包括瀏覽器調試,不包括web移動端調試。本文調試均在chrome瀏覽器進行 alert 這個不用多說了,不言自明 console 基本輸出 想必大家都在用console.log在控制...

    luqiuwen 評論0 收藏0
  • Chrome 調試技巧

    摘要:而就是告訴程序在那里停下來進行單步調試,俗稱斷點。面向,專為異步而生的斷點調試功能。中的調試技巧元素的控制臺書簽開發者工具和都提供了書簽功能,用于顯示你在元素標簽頁或標簽頁中最后點擊的元素。 寫在前面本文包括瀏覽器調試,不包括web移動端調試。本文調試均在chrome瀏覽器進行 alert 這個不用多說了,不言自明 console 基本輸出 想必大家都在用console.log在控制...

    fantix 評論0 收藏0
  • Chrome 調試技巧

    摘要:而就是告訴程序在那里停下來進行單步調試,俗稱斷點。面向,專為異步而生的斷點調試功能。中的調試技巧元素的控制臺書簽開發者工具和都提供了書簽功能,用于顯示你在元素標簽頁或標簽頁中最后點擊的元素。 寫在前面本文包括瀏覽器調試,不包括web移動端調試。本文調試均在chrome瀏覽器進行 alert 這個不用多說了,不言自明 console 基本輸出 想必大家都在用console.log在控制...

    Yumenokanata 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<