C語言(長期更新)
第7講
VS實用調試技巧
????跟著潼心走,輕松拿捏C語言,困惑通通走,一去不回頭~歡迎開始今天的學習內容,你的支持就是博主最大的動力。
目錄
C語言(長期更新)
第7講
VS實用調試技巧
知識回顧
?前言
7.1 Bug
7.2 調試
7.3 F5和F9
7.4release和debug
7.5 幾個常用快捷鍵及功能
7.6 調試案例1
7.7調試案例2
7.8 編程常見錯誤歸類
知識回顧
今天我們來學習一些VS實用的調試技巧的內容,坐穩了,我們發車,gogogo!
?前言
在寫代碼的過程中,我們常常可能出現各種各樣的錯誤和問題。今天我們就講一些關于這些的內容
7.1 Bug
很多年以前,在一次大型計算機整機運行時設備突然停止了運轉,研究人員爬上去發現有一只飛蛾,在一組寄存器之間的觸點上引發了高壓觸電,被電死了。這才引發了故障。電腦專家格蕾絲·赫柏(Grace Murrey Hopper)將這只蟲子夾進了工作日志中,并以Bug(蟲子的英文名)命名這次故障。這也就有了我們后來說的這里有Bug存在(在電腦程序中隱藏的、未被發現的,問題,漏洞)
7.2 調試
我們在先前的學習中,有時會用F10進行調試,對學習的內容做一個輔助說明。在實際寫代碼的過程中,我們使用調試也可以找到報錯,出bug的原因。
按下F10開始調試后,我們打開監視的窗口,添加要監視的變量,就可以進行bug的查找。
可以打開多個懸停的監視窗口
?F11可以進入函數內部
7.3 F5和F9
在使用VS的過程中,我們會用到幾個快捷鍵
下面我們就來詳細介紹一下
- F5 開始調試
- Ctrl+F5 開始執行不調試
這倆有啥區別呢
這就涉及到另一個F9 斷點 了
斷點F9經常會與F5開始調試配合使用,其作用是在調試的過程中暫停在某一步
原本按F5,程序的調試會直接進行,不會中斷。這個過程極為迅速,不利于觀察
添加斷點,再運行F5時,就會在斷點處中斷,方便我們檢查某一可能出現問他的地方
再次按下F5,箭頭(代表調試進程)會跳到下一個斷點
可以看到,按下F9添加斷點后,再次按下F5,這次就沒有直接全部執行完,而是左端的箭頭停在了第一個斷點的位置。
再次按下F5,我們會發現,它依舊停在了第11行的位置
奇了怪了,不是說會停在下一個斷點的位置嗎?
這里的下一個斷點指的是執行邏輯上的下一個斷點。由于循環的存在,需要按10次F5才能調到第13行的斷點。
結合具體的例子,我們大致明白了F5和F9是如何配合使用的了。這也就是F5和Ctrl+F5的區別所在。Ctrl+F5是執行不調試,自然也就不會有斷點這一說。
7.4release和debug
我們注意到,在上面VS界面的截圖中,有Debug和Release兩個選項
我們在運行代碼后就會在代碼保存的位置發現一個叫Debug的文件夾
與之對應,選擇Release就會在同樣位置出現叫Release的文件夾
它們的區別在哪里捏?
1.Debug
Debug是可調試的,方便程序員修改、調試代碼,是未經優化的。
debug在英文中的意思是消除bug,de這個前綴有delete刪去的含義。
2.Release
Release是供用戶使用,為保障運行速度,經過優化后的版本,不可調試。
我們的測試人員就會針對這個版本進行測試,提升用戶體驗。
如果我們分別生成兩個文件就會發現Debug文件夾的大小要不Release要大,這就是包含調試信息的緣故。
7.5 幾個常用快捷鍵及功能
VS快捷鍵使用技巧(超全)_vs自動縮進快捷鍵 csdn-CSDN博客
內存也是很常見的
7.6 調試案例1
邏輯漏洞出現在哪里呢?
通過調試我們發現,由于j在每次內循環時沒有復位(即每次開始循環是并不都是從1開始,先前的值依舊在j中存儲),導致出現了BUG
如果我們不能直接發現這個隱藏的邏輯漏洞,調試就可以幫助我們更加迅速的找到問題所在、
在寫代碼的過程中我們一定要注意
1.保持頭腦的清醒
2.你要知道你的想要什么效果
3.在調試的過程中,觀察代碼是不是按照你的需要(想法)在執行。
4.如果你發現代碼并沒有按照你的想法在走,這里就是bug了
除此之外,我們上面的代碼還可以進行優化
既然每次階乘前面都是一樣的,也就是說j不用每次從1開始加,在先前基礎上再乘以n就行啦
7.7調試案例2
與環境相關的bug
我們會發現在VS2022 Debug x86的環境配置下,會無限循環打印hehe
我們能判斷到可能的錯誤是
非法訪問內存導致的越界
我們通過調試可以發現
在監視窗口中arr[12]的值竟和 i 的值同步變化,而我們輸入地址發現兩者地址竟也相同。
這是怎么回事捏?
我們知道內存分為棧區,堆區,靜態區
arr[10]和 i 都是局部變量,局部變儲存在棧區中
內存的存儲一般是由高地址到低地址的
然而數組中元素的存放卻是從低到高按順序存放的
在VS2022 Debug x86 的運行環境下,i和arr[9]的距離只有2個整型的空間,所以當arr[12]要按順序存放時恰好占據了i的位置,因此當它置為0時,i也隨之變為0了,這就造成了死循環
調試過程中,要做到心中有數,也就是程序員自己心里要清晰的知道希望代碼怎么執行,然后再去看代碼有沒有按照我們預定的路線在執行。
調試是需要反復去動手練習的,調試是可以增加程序員對代碼的理解和掌控的,掌握了調試的能力,就能看到本質,就像能給程序做B超一樣,對程序內部一覽無余。
程序員的三種境界:
1.看代碼就是代碼? ? 一字母,函數,
2.看代碼不是代碼? ? 一內存,邏輯,本質? ? ?調試是必須掌握的(必要條件)
3.看代碼還是代碼
7.8 編程常見錯誤歸類
- 編譯錯誤——語法錯誤
- 鏈接錯誤——無法解析的外部符號LNK
- 運行錯誤——語法正確,可運行,但存在bug——調試解決
?? ?好了今天的學習內容就到這里啦,謝謝你的陪伴,我是潼心,下次再見~如果這篇文章對你有幫助的話。請務必給主播一個一鍵三連,球球了,這對主播很重要~