摘要:調(diào)試的基本步驟發(fā)現(xiàn)程序錯(cuò)誤的存在以隔離消除等方式對(duì)錯(cuò)誤進(jìn)行定位確定錯(cuò)誤產(chǎn)生的原因提出糾正錯(cuò)誤的解決辦法對(duì)程序錯(cuò)誤予以改正重新測(cè)試和版本的介紹通常稱為調(diào)試版本,它包含調(diào)試信息,并且不做任何優(yōu)化,以便于程序員調(diào)試。
在我們編寫(xiě)代碼的時(shí)候難免會(huì)遇到很多問(wèn)題,我們光靠眼睛是很難看出來(lái)哪里出問(wèn)題了,這時(shí)我們往往需要?jiǎng)邮忠徊揭徊降倪\(yùn)行程序找出問(wèn)題的所在,這個(gè)過(guò)程就是調(diào)試的過(guò)程。在IT界流傳著這么一句話“一名優(yōu)秀的程序員也是一名優(yōu)秀的偵探”所以當(dāng)我們遇到問(wèn)題時(shí),還是要多動(dòng)手,嘗試調(diào)試,才能有進(jìn)步。希望大家多多給予支持,贈(zèng)人玫瑰,手有余香!
現(xiàn)在提起bug,大都想到的是「程序錯(cuò)誤、漏洞」,其實(shí)bug的原意為「昆蟲(chóng)」
為什么變成這樣呢? 因?yàn)槭澜缟系谝粋€(gè)程序錯(cuò)誤就是由一只昆蟲(chóng)所造成的
1947年9月9日,葛麗絲·霍普(Grace Hopper)發(fā)現(xiàn)了第一個(gè)電腦上的bug。當(dāng)在Mark II計(jì)算機(jī)上工作時(shí),整個(gè)團(tuán)隊(duì)都搞不清楚為什么電腦不能正常運(yùn)作了。經(jīng)過(guò)大家的深度挖掘,發(fā)現(xiàn)原來(lái)是一只飛蛾意外飛入了一臺(tái)電腦內(nèi)部而引起的故障(如圖所示)。這個(gè)團(tuán)隊(duì)把錯(cuò)誤解除了,并在日記本中記錄下了這一事件。也因此,人們逐漸開(kāi)始用“Bug”(原意為“蟲(chóng)子”)來(lái)稱呼計(jì)算機(jī)中的隱錯(cuò)。 —— 維基百科
所謂調(diào)試(Debug),就是讓代碼一步一步慢慢執(zhí)行,跟蹤程序的運(yùn)行過(guò)程。 比如,可以讓程序停在某個(gè)地方,查看當(dāng)前所有變量的值,或者內(nèi)存中的數(shù)據(jù);也可以讓程序一次只執(zhí)行一條或者幾條語(yǔ)句,看看程序到底執(zhí)行了哪些代碼。
Debug通常稱為調(diào)試版本,它包含調(diào)試信息,并且不做任何優(yōu)化,以便于程序員調(diào)試。
Release稱為發(fā)布版本,它往往是進(jìn)行了各種優(yōu)化,使得程序在代碼的大小和運(yùn)行速度上都是最優(yōu)的,以便用戶更好的使用。
可以看出在文件大小上有了明顯的差異。
下面,我們用一個(gè)代碼示例來(lái)說(shuō)明Release相對(duì)于Debug版本發(fā)生了優(yōu)化。
代碼示例:
int main(){ int i = 0; int arr[10] = {1,2,3,4,5,6,7,8,9,10}; for (i = 0; i <= 12; i++) { arr[i] = 0; printf("hehe/n"); } return 0;}
上述代碼在Debug版本中運(yùn)行時(shí)導(dǎo)致了死循環(huán),而在Release版本編譯時(shí),程序沒(méi)有死循環(huán)。這之中的區(qū)別就是因?yàn)閮?yōu)化問(wèn)題而出現(xiàn)的。
這是因?yàn)樵谝恍┚幾g器中,在棧中儲(chǔ)存如果i和arr之間的空間適合的話,就有可能使用的arr數(shù)組向后越界就訪問(wèn)到了i,造成循環(huán)變量i的改變,最終死循環(huán)。
注:
i和arr是局部變量
局部變量是放在棧區(qū)上的
棧區(qū)上內(nèi)存的使用習(xí)慣是:先使用高地址處的空間,再使用低地址處的空間。
數(shù)組隨著下標(biāo)的增長(zhǎng),地址是由低到高變化。
注:Debug可以調(diào)試,Release不可以調(diào)試。
在環(huán)境中選擇Debug選項(xiàng),才可以正常調(diào)試。
我們介紹幾個(gè)最常用的快捷鍵:
F9:設(shè)置斷點(diǎn)或取消斷點(diǎn),可以在任意位置設(shè)置,這樣可以使得程序在想要的位置停下來(lái)。
F5:?jiǎn)?dòng)調(diào)試,往往與F9設(shè)置斷點(diǎn)配合使用,使開(kāi)始調(diào)試就跳到斷點(diǎn)處。
F10:逐過(guò)程調(diào)試,一個(gè)過(guò)程可以是一條語(yǔ)句,也可以是一個(gè)函數(shù)。遇到函數(shù)不進(jìn)入函數(shù)內(nèi)部。
F11:逐語(yǔ)句調(diào)試,每次執(zhí)行一條語(yǔ)句,可以使執(zhí)行邏輯進(jìn)入函數(shù)內(nèi)部。shift+F11跳出函數(shù)。
CTRL + F5:開(kāi)始執(zhí)行不調(diào)試。
設(shè)置斷點(diǎn)+F5 再F10或者F11(進(jìn)入函數(shù)內(nèi)部) shift+f11 退出函數(shù)
在調(diào)試開(kāi)始之后,用于觀察各個(gè)變量值的變化;
在調(diào)試開(kāi)始之后,用于觀察內(nèi)存信息;
通過(guò)查看調(diào)用堆棧,我們可以看出函數(shù)的調(diào)用關(guān)系以及當(dāng)前調(diào)用所處的位置;
下面我們給出一個(gè)簡(jiǎn)單的調(diào)試實(shí)例,讓大家可以切身體會(huì)一下調(diào)試的過(guò)程,朋友們可以動(dòng)手試一試。
int main(){ int n = 0, sum = 0; int ret = 1; scanf("%d", &n); for (int i = 1; i <= n; i++) { for (int j = 1; j <= i; j++) { ret *= j; } sum += ret; } printf("%d/n", sum); return 0;}
如果我們輸入3,正確答案應(yīng)該是9,而程序運(yùn)行相互來(lái)確實(shí)15,這時(shí)我們可以通過(guò)調(diào)試找出問(wèn)題的所在。
OK!!!觀眾老爺們,這里只是介紹了簡(jiǎn)單的調(diào)試技巧,如果朋友們覺(jué)得有一點(diǎn)點(diǎn)作用的話,希望朋友們能夠給予小菜鳥(niǎo)一點(diǎn)支持!后續(xù)繼續(xù)給朋友們帶來(lái)更好的博文,還希望朋友們能夠繼續(xù)關(guān)注,小菜鳥(niǎo)致力于把自己的學(xué)習(xí)經(jīng)驗(yàn)與個(gè)人理解更多的分享給大家,望大家喜歡與指正。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/124505.html
摘要:交換元素利用數(shù)組解構(gòu)來(lái)實(shí)現(xiàn)值的互換調(diào)試我們經(jīng)常使用來(lái)進(jìn)行調(diào)試,試試也無(wú)妨。提供了完整的環(huán)境,并且支持自定義域名指向,動(dòng)態(tài)計(jì)算資源調(diào)整,可以完成各種應(yīng)用的開(kāi)發(fā)編譯與部署。 7 Hacks for ES6 Developers Hack #1 交換元素 利用數(shù)組解構(gòu)來(lái)實(shí)現(xiàn)值的互換 let a = world, b = hello [a, b] = [b, a] console.log(a...
摘要:見(jiàn)過(guò)太多同學(xué)調(diào)試只會(huì)用簡(jiǎn)單的甚至,看著真為他們捉雞。。下面我就分享一些實(shí)用且聰明的調(diào)試技巧,希望能讓大家調(diào)試自己代碼的時(shí)候更加從容自信。其實(shí)提供了文件的搜索功能,只不過(guò)大部分時(shí)候我們給忽略了。。 見(jiàn)過(guò)太多同學(xué)調(diào)試Javascript只會(huì)用簡(jiǎn)單的console.log甚至alert,看著真為他們捉雞。。因?yàn)榇蠖鄶?shù)同學(xué)追求優(yōu)雅而高效地寫(xiě)代碼,卻忽略了如何優(yōu)雅而高效地調(diào)試代碼,不得不說(shuō)是有點(diǎn)...
摘要:超實(shí)用使用技巧分享長(zhǎng)篇前言工欲善其事必先利其器最近受部門的邀請(qǐng),給入職新人統(tǒng)一培訓(xùn),發(fā)現(xiàn)有很多新人雖然日常開(kāi)發(fā)使用的是,但是還是很多好用的技巧沒(méi)有用到,只是用到一些基本的功能,蠻浪費(fèi)這個(gè)優(yōu)秀的。 IDEA 超實(shí)用使用技巧分享(長(zhǎng)篇) showImg(https://segmentfault.com/img/remote/1460000019977268?w=1280&h=800); 前...
摘要:今天分享一些平時(shí)不常用,但總有一天你會(huì)用到的瀏覽器調(diào)試技巧。如圖彩蛋介紹一個(gè)在瀏覽器中全局搜索代碼的方法,點(diǎn)擊面板,會(huì)看到左側(cè)有目錄結(jié)構(gòu),右鍵目錄結(jié)構(gòu)。如圖小擴(kuò)展還有一個(gè)場(chǎng)景一個(gè)頁(yè)面會(huì)從后臺(tái)請(qǐng)求字體包,字體包會(huì)在某個(gè)時(shí)刻通過(guò)加入到標(biāo)簽中。 今天分享一些平時(shí)不常用,但總有一天你會(huì)用到的瀏覽器調(diào)試技巧。先來(lái)看一個(gè)H5頁(yè)面,下面是地址http://liticool.info/wsvist/i...
閱讀 2935·2023-04-26 01:01
閱讀 3704·2021-11-23 09:51
閱讀 2530·2021-11-22 14:44
閱讀 3633·2021-09-23 11:57
閱讀 2848·2021-09-22 14:58
閱讀 5890·2021-09-10 11:25
閱讀 2117·2019-08-30 13:11
閱讀 1607·2019-08-30 12:59