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