Visual Studio調試的技巧

1.什么是bug?

bug:程序漏洞,也就是程序中存在的問題。

2.什么是調試?

當我們發現了程序中的問題后就會解決問題,前提是要找到問題,那么進行調試(debug)以此來找到問題。

3.debug 和 release

在vs里編寫代碼時就有 debug 和 release 兩個選項:

Debug 通常稱為調試版本,包含調試信息,但是不會對代碼進行優化,可以進行調試的。

Release 稱為發布版本,是會對代碼自動進行代碼優化的,不可以調試,當程序員寫好程序后并對程序進行測試,測試完成后就會發布release版本,面向用戶使用。沒有包含調試信息,所以是不可以進行調試的。

從上面我們就可以知道 debug 版本要比 release 版本要大得多,就是因為debug里面包含調試信息

4.vs調試技巧的快捷鍵

4.1準備環境

環境就是 vs 的 debug 版本

4.2調試常用的快捷鍵

F9:創建斷點和取消斷點

斷點的作用是可以在程序的任意位置設置斷點,打上斷點就可以使得程序執行到想要的位置暫停執行,之后我們就可以使用 F10、F11 更加深層次的觀察代碼的執行細節

條件斷點:滿足這個條件,才觸發斷點

在下面輸入條件:

F5:啟動調試,經常用來直接跳到下一個斷點處,一般是和F9配合使用。

F10:逐過程,通常用來處理一個過程,一個過程可以是一次函數調用,也可以是一條語句。

F11:逐語句,就是每次都執行一條語句,但是這個快捷鍵可以使我們進入函數內部,更加仔細地觀察語句,此時就必須使用 F11,如果使用 F10 ,直接完成函數調用。

CTRL+F5:開始執行不調試。

5.監視和內存觀察

5.1監視

當我們想明白每一個變量變化的每一個過程的時候,我們就可以選擇監視,但是監視的前提是一定要調試才可以監視到每一個變量的變化。

?上面的監視窗口任意選一個就行,然后按 F10 就可以觀察到了:

上面經歷五次循環之后的數組內容

5.2 內存

如果想看數組arr、變量num、變量a的地址可以在地址欄那里寫入:arr(數組名本來就是地址)? &num? &a

6.調試舉例1

求 1!+2!+3!+4!+...10! 的和,我這里的代碼寫的是 3 是為了方便檢查寫的代碼是否正確:

(你們運行的時候可以改動一下)

int main()
{int n = 3;int i = 0;int sum = 0;for (n = 1; n <= 3; n++){int ret = 1;for (i = 1; i <= n; i++) {ret = ret * i;}sum +=ret;}printf("%d\n", sum);return 0;
}

7.調試舉例2

在VS2022、X86、Debug 的環境下,編譯器不做任何優化的話,下?代碼執?的結果是啥?

#include <stdio.h>
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;
}

當我們在上面要求的環境中運行時就會發現:

這個時候就要調試看看到底怎么回事?

其實調試到這里我們就可以發現這里是i的地址,當我們再按一次F10時,i 明明該為13了,但是 i 就被初始化為0了,所以才會進入死循環。

本質原因:

棧區內存中習慣是從高地址開始使用,因為先創建的是變量 i 的地址,所以 i 的地址比數組 arr 的地址高,而又因為數組在內存當中的存放是下標越大的,地址越高,也就是從低地址開始使用的,本來數組就越界了,所以有可能數組就會覆蓋到 i ,所以進入死循環。而 i 和 arr剛好間隔兩個整形的空間,這完全取決于環境,每次的變量在內存的分配都是由編譯器指定的,所以演示這道題時規定了環境。

如果將 i 和 arr 初始化的順序交換一下,就不會出現這種情況了

或者是改成 release 環境下,也不會出現死循環,這是因為 release 會自動地優化代碼,但是會報錯,因為數組越界了

8.變成常見的錯誤

8.1 編譯型錯誤:

檢查語法的錯誤——最簡單的

8.2鏈接型錯誤:

聲明自己寫的同文件沒有寫對呀,等等~

8.3運行時錯誤

前面的兩步都沒有報錯,但是運行的結果和自己預期的結果不一樣,這個是最麻煩的,這個時候就要進行調試了

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

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

相關文章

C++ 各種map對比

文章目錄 特點比較1. std::map2. std::unordered_map3. std::multimap4. std::unordered_multimap5. hash_map&#xff08;SGI STL 擴展&#xff09; C 示例代碼代碼解釋 特點比較 1. std::map 底層實現&#xff1a;基于紅黑樹&#xff08;一種自平衡的二叉搜索樹&#xff09…

fontTools工具的使用介紹

前言 python工具庫fontTools&#xff0c;我是用來壓縮前端字體的&#xff0c;優化前端請求速度的&#xff1b;使用的過程中&#xff0c;遇到了不少的坑&#xff0c;把這個過程記錄下來&#xff0c;防止再犯。 安裝 # fontTools 4.56.0 pip install fontTools提取子字體集 方…

利用大語言模型生成的合成數據訓練YOLOv12:提升商業果園蘋果檢測的精度與效率

之前小編分享過關于《YOLO11-CBAM集成&#xff1a;提升商業蘋果園樹干與樹枝分割的精準度》&#xff0c;改進YOLO11算法后&#xff0c;進行蘋果樹的實例分割。本期文章我們將分享關于最新的YOLO12算法改進的蘋果目標檢測。 論文題目&#xff1a;Improved YOLOv12 with LLM-Gen…

設計模式 二、創建型設計模式

GoF是 “Gang of Four”&#xff08;四人幫&#xff09;的簡稱&#xff0c;它們是指4位著名的計算機科學家&#xff1a;Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides。他們合作編寫了一本非常著名的關于設計模式的書籍《Design Patterns: Elements of Reusable…

redis,tar.gz安裝后,接入systemctl報錯解決

1. WARNING Memory overcommit must be enabled! 這種報錯&#xff0c;有兩種解決方法 1.1 修改系統參數 編輯 /etc/sysctl.conf 文件&#xff0c;設置 overcommit_memory 為 1 vm.overcommit_memory 11.2 修改redis的最大使用內存 修改配置文件 redis.conf maxmemory 1g…

Python繪圖技巧,主流繪圖庫

一、主流繪圖庫概覽 1. 核心工具對比 庫名稱特點適用場景Matplotlib基礎繪圖庫&#xff0c;高度可定制科學繪圖、論文圖表Seaborn基于Matplotlib&#xff0c;統計圖表優化數據分布、關系可視化Plotly交互式可視化&#xff0c;支持網頁輸出儀表盤、動態數據展示Pandas內置簡易…

網絡安全之前端學習(HTML篇)

前言&#xff1a;網絡安全中有一個漏洞叫xss漏洞&#xff0c;就是利用網頁引發彈窗&#xff0c;這就要求我們看得懂源碼&#xff0c;所以我會持續更新前端學習&#xff0c;可以不精通&#xff0c;但是一定要會&#xff0c;主要掌握HTML&#xff0c;css&#xff0c;js這三項技術…

Qt 多線程設計:死循環與信號槽的權衡

在開發音視頻播放器時&#xff0c;多線程設計是不可避免的挑戰。音頻和視頻的解碼、播放需要高效運行&#xff0c;同時還要與主線程或其他線程同步&#xff0c;例如通過信號通知播放進度。本文基于一個實際案例&#xff0c;分析了兩種線程設計在死循環和信號槽使用中的表現&…

knowledge-微前端(多個前端應用聚合的一個應用架構體系,每個小的應用可獨立運行,獨立開發,獨立部署上線)

1.前言 微前端&#xff0c;將一個大的前端應用拆分為多個小型的&#xff0c;獨立開發的前端應用&#xff0c;每一個小型的應用都可以單獨的開發&#xff0c;部署和運行。這種結構允許不同的團隊使用不同的技術棧來開發應用的不同部分&#xff0c;提高開發的效率與靈活性。 2.實…

工廠函數詳解:概念、目的與作用

一、什么是工廠函數&#xff1f; 工廠函數&#xff08;Factory Function&#xff09;是一種設計模式&#xff0c;其核心是通過一個函數來 創建并返回對象&#xff0c;而不是直接使用 new 或構造函數實例化對象。它封裝了對象的創建過程&#xff0c;使代碼更靈活、可維護。 二、…

旋轉位置編碼(Rotary Positional Encoding, RoPE):中文公式詳解與代碼實現

旋轉位置編碼&#xff08;Rotary Positional Encoding, RoPE&#xff09;&#xff1a;中文公式詳解與代碼實現 在序列模型中&#xff0c;位置信息對于任務的理解至關重要。傳統的絕對和相對位置編碼各有優缺點&#xff0c;而RoPE作為一種創新的位置編碼方法&#xff0c;展現了…

C語言-指針變量和變量指針

指針 預備知識 內存地址 字節&#xff1a;字節是內存的容量單位&#xff0c;英文名Byte&#xff0c;1Byte8bits 地址&#xff1a;系統為了便于區分每一個字節面對它們的逐一進行編號&#xff08;編號是唯一的&#xff09;&#xff0c;稱為內存地址&#xff0c;簡稱地址。int…

unityAB包(1/2)

unityAB包學習 1.AB包的導出擴展BuildAssetBundleOptions無特殊選項壓縮相關選項 2.AB包資源管理3.Resource和AssetBundle加載方式的區別4.預設體5.Unity Asset Bundle Browser 工具5為什么要勾選拷貝到StreamingAsset里面。6.AB包的加載 1.AB包的導出 首先在Project窗口&…

算法——廣度優先搜索——跨步迷宮

原題鏈接 思路&#xff1a;找出最短路徑&#xff0c;然后判斷是否存在連續三個點是橫縱坐標相等的&#xff0c;如果有就步數減1 但是有兩個樣例過不了 錯誤原因&#xff1a;在錯誤的測試案例中&#xff0c;最短路徑可能有多條&#xff0c;而我剛好選了一條比較曲折的&#x…

某酒企數字化轉型及電商規劃項目啟動會暨培訓會v(60頁PPT)(文末有下載方式)

詳細資料請看本解讀文章的最后內容。 在當今數字化浪潮席卷之下&#xff0c;企業的發展面臨著前所未有的機遇與挑戰。對于某酒企而言&#xff0c;數字化轉型和電商規劃已成為其實現 “二次騰飛”、邁向世界級酒企的關鍵戰略舉措。本次啟動會暨培訓會&#xff0c;為該酒企的轉型…

NET6 WebApi第5講:中間件(源碼理解,俄羅斯套娃怎么來的?);Web 服務器 (Nginx / IIS / Kestrel)、WSL、SSL/TSL

一、NET6的啟動流程 區別&#xff1a; .NET6 WebApi第1講&#xff1a;VSCode開發.NET項目、區別.NET5框架【兩個框架啟動流程詳解】_vscode webapi-CSDN博客 2、WebApplicationBuilder&#xff1a;是NET6引入的一個類&#xff0c;是建造者模式的典型應用 1>建造者模式的…

vue中根據html動態渲染內容

需求&#xff1a;根據數據中的html&#xff0c;因為我是在做填空&#xff0c;所以是需要將html中的_____替換成input&#xff0c;由于具體需求我使用的是元素contenteditable代替的可編輯的input html部分 <div class"wrap"><component :is"rendered…

【AI】AI編程助手:Cursor、Codeium、GitHub Copilot、Roo Cline、Tabnine

文章目錄 一、基本特性對比二、收費標準三、私有部署能力1、Tabnine2、Roo Code 三、代碼補全與自然語言生成代碼四、安裝獨立的IDE安裝插件安裝 五、基本使用&#xff08;一&#xff09;Cursor&#xff08;二&#xff09;GitHub Copilot1、獲取代碼建議2.聊天1&#xff09;上下…

三軸云臺之角速度信號篇

三軸云臺的角速度信號主要通過其內置的傳感器&#xff08;如陀螺儀&#xff09;來感知和測量。 一、角速度信號的感知與測量 在三軸云臺中&#xff0c;陀螺儀是測量角速度的關鍵組件。它通常安裝在三個互相垂直的軸上&#xff08;通常為X、Y、Z軸&#xff09;&#xff0c;能夠…

Grid 布局實現三欄布局

使用 CSS Grid 布局實現三欄布局(左右固定 100px,中間自適應)的核心原理是通過網格模板精確控制列寬分配。以下是具體實現方法及優化技巧: 一、基礎實現 ?父容器設置 為外層容器添加 display: grid 使其成為網格容器,并通過 grid-template-columns 定義列寬 css .contain…