C語言(長期更新)第7講:VS實用調試技巧

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 編程常見錯誤歸類

  1. 編譯錯誤——語法錯誤
  2. 鏈接錯誤——無法解析的外部符號LNK
  3. 運行錯誤——語法正確,可運行,但存在bug——調試解決

?? ?好了今天的學習內容就到這里啦,謝謝你的陪伴,我是潼心,下次再見~如果這篇文章對你有幫助的話。請務必給主播一個一鍵三連,球球了,這對主播很重要~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/94119.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/94119.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/94119.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CONTRASTIVE-KAN:一種用于稀缺標記數據的網絡安全半監督入侵檢測框架

研究背景與挑戰? ?工業環境需求?: 第四次工業革命中,物聯網(IoT)和工業物聯網(IIoT)的普及使網絡安全成為關鍵挑戰。 入侵檢測系統需實時性高,尤其對關鍵基礎設施(如燃氣管道)的快速攻擊檢測至關重要。 ?核心問題?: ?標簽數據稀缺?:工業系統多數時間處于正常…

綜合:單臂路由+三層交換技術+telnet配置+DHCP

技術考核1 實驗拓撲:實驗需求 1.按照圖示配置IP地址設備名 2.在SW1和SW2之間配置鏈路聚合增加鏈路帶寬,提高可靠性 3.PC5和PC6屬于VLAN10, PC7和PC8屬于VLAN20 4.SW1和SW2屬于二層交換機,SW3為三層交換機(VLAN100用于對…

工業火焰識別漏報率↓78%!陌訊多模態融合算法實戰解析

原創聲明:本文技術方案解析基于陌訊技術白皮書2025版 標簽:#陌訊視覺算法 #火焰識別優化 #工業安全監控 #邊緣計算優化一、行業痛點:工業火災監控的漏檢危機據《2025工業安全白皮書》統計,化工場景傳統火焰識別系統漏報率高達35%&…

C++引用:高效安全的別名機制詳解

目錄 一、引用的概念 二、引用的特性 1、定義時必須初始化 2、一個變量可以有多個引用 3、引用一旦綁定實體就不能更改 三、const引用(常引用) 1、const引用的基本特性 2、臨時對象與const引用 3、臨時對象的特性 4、const 引用作為函數形參 …

大語言模型API付費?

下面是目前主流 大語言模型 API 的付費情況總覽: 🧠 一、主要大語言模型 API:是否付費對比 提供方模型是否免費限制 / 說明OpenAIGPT-3.5 / GPT-4 / GPT-4o? 付費為主有免費額度(如 ChatGPT 免費版),API …

巧用Wisdom SSH:容器化運維與傳統運維的抉擇

巧用Wisdom SSH:容器化運維與傳統運維的抉擇 在當下的技術領域,容器化運維與傳統運維是運維人員面臨的兩大主要方向,對于從業者來說,如何抉擇至關重要,而Wisdom SSH在其中能發揮顯著作用。 傳統運維:基石…

API征服者:Python抓取星鏈衛星實時軌跡

API征服者:Python抓取星鏈衛星實時軌跡從基礎調用到工業級衛星追蹤系統實戰指南一、太空數據時代:星鏈衛星的全球覆蓋??星鏈衛星網絡規模??:已發射衛星數量:4,000目標衛星總數:42,000軌道高度:340km - …

《深潛React列表渲染:調和算法與虛擬DOM Diff的優化深解》

當用戶在內容平臺無限滑動,或是在管理系統中處理成百上千條數據時,每一次無卡頓的交互,都是調和算法與虛擬DOM Diff機制協同工作的成果。理解這兩者的底層邏輯,不僅是性能優化的鑰匙,更是從“使用框架”到“理解框架”…

自動化與配置管理工具 ——Ansible

一、Ansible 概述1.1 核心特性Ansible 是一款開源的自動化運維工具,采用無代理(Agentless)架構,通過 SSH 協議實現對遠程節點的管理。其核心特性包括:無代理架構:被管理節點無需安裝代理軟件,降…

Effective C++ 條款18:讓接口容易被正確使用,不易被誤用

Effective C 條款18:讓接口容易被正確使用,不易被誤用核心思想:設計接口時,應使正確使用方式直觀自然,同時通過類型系統、行為約束等手段主動預防常見錯誤,減少用戶犯錯的可能性。 ?? 1. 接口誤用的常見陷…

nodejs讀寫文件

1.讀文件 node有很多模塊,可在node模塊查看相應模塊; var fsrequire(fs)fs.readFile(./src/a.doc,utf8,function(err,data){// 如果發生錯誤,data是undefined 如果成功 err為null console.log(err); console.log(data); }) 2.寫文件 var…

ConcurrentHashMapRedis實現二級緩存

1. 為什么使用ConcurrentHashMap?在Java中,ConcurrentHashMap 是一個線程安全且高效的哈希表實現,廣泛用于高并發場景。將其用作一級緩存的原因主要包括以下幾點:1.1. 線程安全性ConcurrentHashMap 是線程安全的,支持多…

Mysql集群技術

實驗在RHEL7中做,因為9中缺少了一個關鍵的高可用組件環境:兩臺數據庫,內存和CPU要多一點主流是MYSQL(開源),Oracle收費較貴RHEL7中直接用make編譯是有問題的,所以需要要gcc工具做好前置準備&…

自動駕駛嵌入式軟件工程師面試題【持續更新】

文章目錄前言請描述 CAN 幀的基本結構(包括標識符、數據字段、CRC 等)描述 WebSocket 協議的基本工作流程(包括握手、數據幀結構)請說明如何實現 WebSocket 連接的心跳機制以檢測連接狀態,并描述在斷開后如何通過重連策…

vue(5)-組件

一.組件三大組成部分(結構/樣式/邏輯)(1)組件樣式沖突用scoped全局樣式在組件中起全局作用,局部樣式可以加scoped屬性來只作用于當前組件圖中只給baseone加這個樣式,就在baseone中style加scoped&#xff08…

【機器學習】兩大線性分類算法:邏輯回歸與線性判別分析:找到分界線的藝術

文章目錄一、核心概念:數據分類的"切分線"二、工作原理:從"找分界線"理解二、常見算法1、邏輯回歸:二分類2、線性判別分析(LDA):分類與降維3、兩種算法對比分析三、實際應用&#xff1…

靜態分析c/cpp源碼函數調用關系圖生成

calltree calltree 不好使用 Dpxygen https://www.doxygen.nl/download.html Graphviz https://graphviz.org/download/ 靜態代碼調用結構圖分析、構建、生成 doxygen doxygen在win和linux上均可運行,可以自動分析源碼,對c語言項目友好,預處…

使用 MySQL Shell 進行 MySQL 單機到 InnoDB Cluster 的數據遷移實踐

遷移背景與環境原來都是用mysqldump,DTS或者cdc遷移,這次8.0用了下新工具感覺挺好用的,簡單快捷,30G數據不到源環境:單機 MySQL 8.0,地址為 172.23.3.28目標環境:InnoDB Cluster 集群&#xff0…

淘寶商品API可以獲取哪些商品詳情數據?

商品詳情頁商品全部sku信息"skus": {"sku": [{"price": 45.6,"total_price": 0,"orginal_price": 45.6,"properties": "1627207:39617249736","properties_name": "1627207:39617249736…

新一代PLC控制軟件平臺EsDA-AWStudio

在工業自動化和智能制造領域,高效的軟件平臺是提升開發效率和系統性能的關鍵。ZLG致遠電子推出的EsDA-AWStudio平臺,憑借其強大的功能和靈活的設計,為工業控制和物聯網應用提供了全新的解決方案。一站式PLC工業控制軟件平臺EsDA-AWStudioZLG致…