編程技能:調試02,設置斷點與刪除斷點

專欄導航

本節文章分別屬于《Win32 學習筆記》和《MFC 學習筆記》兩個專欄,故劃分為兩個專欄導航。讀者可以自行選擇前往哪個專欄。

(一)WIn32 專欄導航

上一篇:編程技能:調試01,調試介紹

回到目錄

下一篇:無

(二)MFC 專欄導航

上一篇:編程技能:調試01,調試介紹

回到目錄

下一篇:無

本節前言

在上一節,我們簡單地介紹了一下調試的概念。

對于調試這一塊,單憑著一點概念,應該還是很難理解其含義的。這一塊,我認為,它是需要你在實踐中,逐漸地來積累經驗與提升技能的。

本專欄所講解的調試知識,是作為一個入門,來教大家幾條基本的調試指令。

本節,我們要教大家的是【開始調試】指令,【繼續】命令和【切換斷點】指令。

標題中,說的不是設置斷點與刪除斷點嗎?沒有講【切換斷點】啊?其實,【切換斷點】在不同的時機,分別等價于設置斷點和刪除斷點。我們在講解具體的知識的時候,大家應該就能理解了。

一.? ? 本節代碼

來看一下本節所用到的代碼。

#include <stdio.h>int calcu01(int x, int y);
int calcu02(int x, int y);
int calcu03(int x, int y);int main(void)
{int a, b, res01, res02, res03;int res;a = 10;b = 20;a++;res01 = calcu01(a, b);res02 = calcu02(a, b);res03 = calcu03(a, b);res = res01;res += res02;res += res03;return 0;
}int calcu01(int x, int y)
{int res;res = x + y;res += x;res *= y;return res;
}int calcu02(int x, int y) 
{int res;res = 2 * x;res *= y;res += y;return res;
}int calcu03(int x, int y)
{int res;res = x * x * x;res -= y;res /= y;return res;
}

這就是本節所用到的代碼了。代碼的行數有點多,不過,并不難。相信大家很容易理解其功能。

為了方便查找和使用,我將這樣的代碼放在了 win32 專欄與 mfc 專欄的 Gitee 代碼倉庫里面了。網址如下所示。

Gitee 網址:Win32 教學課件

Gitee 網址:MFC 教學課件

兩個代碼倉庫里面,關于本節所述的調試案例代碼的路徑,都是一樣的。

在正式使用 Gitee 的功能之前,你可能會需要首先注冊賬號,如果還沒有注冊過 Gitee 的賬號的,你可以前往下面的兩個鏈接所示的文章,了解 Gitee 的基本使用方法。

WIn32 筆記:本專欄課件-CSDN博客

MFC筆記:本專欄課件-CSDN博客

在了解了 Gitee 的基本使用方法的前提下,你可以點擊如下所示的兩個鏈接之一。

Gitee 網址:Win32 教學課件

Gitee 網址:MFC 教學課件

點開了鏈接以后,來到如下所示的頁面,在這里,我以 MFC 專欄課件的頁面為例。

圖1

在寫作本節文章的時候,我還沒有往代碼倉庫里面傳入多少代碼,所以,圖1中的項目很少。等到你看到本篇文章的時候,很有可能,里面的代碼已經是很多很多了。

我們在網頁中找到紅色框線所示的文件夾,單擊進入這個文件夾,結果如下圖所示。

圖2

在我寫作本文的時候,只在【調試案例代碼】文件夾里面傳入了【code1.c】一個源文件。等到你學習本篇內容的時候,有可能,我已經新增了一點源文件。別管新增了多少,你需要找到的,是這個【code1.c】,找到了它以后,單擊它,然后呢,結果如下圖所示。

圖3

這是 Gitee 里面展示的部分的調試案例代碼,圖3中的部分代碼,與本節的代碼塊中的代碼是一樣的。

你可以將代碼倉庫給下載回去,并在相應的路徑中,找到【code1.c】。

到了這里,本節所使用的調試案例代碼的獲取方法,我就講完了。我接著往下講。

二.? ? 建立工程

請大家自行建立 C/C++ 項目,最好是使用 VS2019 來建立項目。

如果還不會用 VS2019 來建立 C/C++ 項目的話,請參考如下鏈接所示的文章。

Windows編程:用 VS2019 編寫C語言程序-CSDN博客

在本節,我需要你將第一分節中的代碼塊中的代碼,設置為 C/C++ 項目中的 main.c 中的源代碼。并自行編譯生成。

三.? ? 【開始調試】命令

在 VS2019 的【調試】菜單下面,有一個【開始調試】命令,如下圖所示。

圖4

之前,我們在編譯好了項目代碼以后,我們是使用【調試】菜單下面的【開始執行(不調試)】命令,來運行解決方案的。

在這里,我們嘗試著點擊【調試】,【開始調試】命令,來運行一下解決方案。

圖5

結果如圖5所示。其實,此刻,【開始調試】和【開始執行(不調試)】的執行效果差不多,都是說,連續運行程序中的所有的代碼行,彈出來一個黑窗口,一口氣執行完畢。

這是因為,此時,我們尚未設置斷點。如果設置了斷點的話,那么,情形就會有所不同了。

請大家關閉圖5 所示的窗口。

接下來,先不要關閉解決方案,我們在下一分節有用。

在進行下一分節之前,請大家記住一件事,那就是,在圖4里面,【開始調試】命令右邊的快捷鍵,F5 。記住它。

四.? ? 設置斷點

請大家點擊一下代碼中的行號為15 的代碼中的某一個位置,讓光標停在 15 行的某一個位置上,如下圖所示。

圖6

在圖6 的紅色框線所示的區域里面,包含有文本光標。其實這個東西,在Windows編程里面,它被稱作文本插入符。以后,我們也會講解文本插入符的編程方法。

在將文本光標設置在 15 行以后,大家依次點擊【調試】,【切換斷點】菜單命令,過程如下圖所示。

圖7
圖8

在圖7里面,【切換斷點】字樣的右邊,給出了這個命令的快捷鍵,F9 。這個快捷鍵,也請大家記住它。當然了,記不住的話,只要你還記得菜單命令的路徑,那么,多看幾次,你也就能記住這個快捷鍵了。

添加斷點的一個方法是,首先點擊想要設置斷點的某一文本行,使得文本光標停在斷點所在的代碼行里面,然后呢,依次點擊【調試】,【切換斷點】命令,然后呢,這一代碼行的左邊就會出現紅色實心圓點了,表明這一行設置了斷點。

添加斷點的另一個方法是,首先點擊想要設置斷點的某一文本行,使得文本光標停在斷點所在的代碼行里面,然后按下功能鍵 F9,也可以在這一代碼行上面設置斷點。

某一代碼行設置了斷點的標志是,這一代嗎行的左邊出現了紅色的圓點。

在圖8 里面,我們看到,在我們執行了【切換斷點】菜單命令以后呢,在行號 15 的左邊,出現了一個圓形的實心紅點。出現了這個東西,就表示說,此時,我們在行號 15 的位置,設置了一個斷點。

當我們在 15 行設置了斷點以后,我們再次執行【調試】,【開始調試菜單命令】,結果如下圖所示。

圖9
圖10

在圖9里面,它沒說【某某程序已退出】,那就是說,程序并未像圖5那樣子,全部執行完并退出。實際上,此時,程序是停在了代碼中的 15 行的位置。

為啥說,此時,程序停在了15行的位置呢?

我們看一下圖10,在圖10 中,我們看到,在斷點標記的中間,有一個黃色填充的箭頭符號。這個黃色箭頭符號指向的是哪一行,就表示程序停在了哪一行代碼上面。

注意,這里所說的程序停在某一行,它是說,這一行尚未執行,而它之前的代碼已經是執行完了。

在本案例中,它是說,第 15 行上面的代碼,13,14行等等的代碼,均已執行完畢,程序即將執行15行,而尚未執行15行的代碼。

斷點的功能,就是讓程序在連續執行期間,遇到了斷點以后,就停下來。

讓連續運行的程序,停在某一個位置,斷開連續執行的狀態,停下來。那么,這個停下來的站點,就叫做斷點。

在 VS2019 里面,斷點會用紅色的圓點來標記。

程序停在斷點上以后,接下來,它會等候我們的調試指令。此時,我們再來嘗試著去執行【調試】,【開始調試】菜單命令。如下圖所示。

圖11

此時,我們在【調試】菜單里面找不到【開始調試】這一子菜單項了,然而,我們可以見到【繼續】這一項。在之前,我們讓大家記過一個知識點,【開始調試】的快捷鍵是 F5,而圖11 中的【繼續】命令的快捷鍵也是 F5 。

個人覺得,其實【開始調試】命令和【繼續】命令是一回事,都是說,讓程序連續運行,直到遇到了斷點,才停下來。

但是呢,在不同的場合,快捷鍵 F5 所對應的名稱卻是不一樣的。當程序尚未啟動調試的時候,那么,【調試】菜單項下面,會顯示著【開始調試】命令。而當我們點擊過【開始調試】,啟動了調試運行的命令以后,假定程序停在了某一個斷點上,那么,這回,【調試】菜單下面,就會顯示有【繼續】命令,而不是顯示【開始調試】命令了。

接下來呢,我們依次點擊【調試】,【繼續】命令。過程如下。

圖12
圖13
圖14

圖13 和圖14 的紅色框線標記的位置,都顯示了【已退出】字樣,表明程序執行完畢,已退出。

請大家關閉圖14 所示的黑窗口。

程序在停在了 15 行上的斷點以后,我們點擊了【調試】,【繼續】命令以后,程序會執行到退出,這是因為,此時,我們在程序中,僅僅設置了 15 行這一個斷點而已。如果,我們再多設置幾個斷點,程序就不會那么快地退出了。

這回呢,我們添加幾個斷點,讓程序慢點退出。

我們在程序的第17行和第21行分別設置斷點,如下圖所示。

圖15

這回呢,我們來執行【調試】,【開始調試】菜單命令,預計,程序會停在15行的位置,程序的執行情況如下所示。

圖16

果然啊,第15行的斷點上,出現了黃色箭頭。

接下來,我們執行一次【繼續】命令。不過,這一次,我們不采用菜單命令的方式,而是采用快捷鍵的方式。【調試->繼續】命令的快捷鍵是 F5,我們按下 F5,觀察執行效果,結果如下。

圖17

看到了沒?這回,黃色小箭頭停在了 17 行的位置了。這表明,此時,程序停在了第17行上面,第17行尚未執行。

我們再按一次 F5,結果如下。

圖18

如圖18 所示,黃色小箭頭出現在了第 21 行的斷點上面。這是本程序的執行流程中的最后一個斷點了。

既然是最后一個斷點,那么,再次按下 F5 鍵,那么,程序就該退出了。我們按一下 F5,結果如下。

圖19
圖20

如圖19 和圖20 所示,程序果然是退出了,并且呢,程序代碼中,不存在黃色小箭頭了。

我們關閉程序執行用的黑窗口。

到了這里,【開始調試】,【繼續】,F5,這幾個命令,我就算是講完了。

接下來,我們來看一看,如何刪除斷點。

五.? ? 刪除斷點

如何來刪除斷點呢?

請大家來跟我一起操作。首先呢,我們點擊一下代碼區域的第 15 行的某一個地方,使得文本光標停在第 15 行里面,如下圖所示。

圖21

接下來呢,請大家依次點選【調試】,【切換斷點】菜單命令,結果如下。

圖22

看到了沒?圖21 里面,15行的左邊還有斷點標記的,而到了圖22 里面,斷點標記就沒有了。

當某一行原本已經設置了斷點的情況下,我們先將文本光標定位在這一斷點所在行上面,然后執行【調試->切換斷點】命令,就會刪除這一行的斷點。

我們再來試著用另一種方法刪除斷點。

首先呢,點擊 17 行的某一個位置,使得文本光標定位在 17 行,如下圖所示。

圖23

然后呢,請大家按下 F9,結果如下。

圖24

,如圖24所示,17 行上的斷點標記被刪除了。

我們之前讓大家記憶過,【調試->切換斷點】的快捷鍵是 F9 。這一次,我們正是用快捷鍵 F9,取代了【調試->切換斷點】菜單命令。

這樣一來,設置斷點和刪除斷點的方法,我就都講完了。

六.? ? 切換斷點的簡易方法

我再來講解一下切換斷點的簡易方法。

此時,在程序中,還剩下21行一個斷點了。

在代碼行號的左邊,有一個豎著的,很窄灰色的區域,如下圖所示。

圖25

當我們點擊這一區域時,鼠標點擊的位置的水平方向上,位于哪一個代碼,哪一個代碼行就會相當于執行了一次【調試->切換斷點】菜單命令。

我們點擊一下 21 行左邊的窄灰色區域,結果如下圖所示。

圖26

我們再來點擊一下 20 行左邊的窄灰色區域,結果如下圖所示。

圖27

這樣一來,20行就設置了斷點。

切換斷點命令,它的效果是,如果某一代碼行原本沒有斷點,則執行這一命令,會設置斷點。如果某一代碼行原本是有斷點的,則執行這一命令會刪除該行斷點。

我們再來設置幾個斷點,如下圖所示。

圖28

如圖 28 所示,我設置了 4 個斷點。在實際項目中,我們可能會設置更多的斷點。

假定我們想要刪除所有的斷點。該怎么辦呢?

我們當然可以一個一個地刪除斷點。然而,我們還可以采用更省事的方法。

請大家跟我做,依次點擊【調試】,【刪除所有斷點】菜單項,過程如下圖所示。

圖29
圖30

在圖30 里面,我們點擊 【是】,結果如下圖所示。

圖31

如圖31 所示,這回呢,我們所設置的 4 個斷點,就被一次性地清除了。

結束語

本節知識,應該是不難的。只是,篇幅大了一點。

希望大家能夠學好本節知識。

專欄導航

本節文章分別屬于《Win32 學習筆記》和《MFC 學習筆記》兩個專欄,故劃分為兩個專欄導航。讀者可以自行選擇前往哪個專欄。

(一)WIn32 專欄導航

上一篇:編程技能:調試01,調試介紹

回到目錄

下一篇:無

(二)MFC 專欄導航

上一篇:編程技能:調試01,調試介紹

回到目錄

下一篇:無

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

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

相關文章

flink寫doris時的優化

1.概念 doris并不擅長高頻、小量數據的導入&#xff1b; 因為doris每一次數據導入都會在be節點上生成數據文件&#xff1b;如果高頻導入小量數據&#xff0c;就會在存儲層產生大量的小文件&#xff08;必然會影響到后續的查詢效率&#xff0c;也會對系統產生更多的compaction…

ElementNotInteractableException原因及解決辦法

在自動化測試中,ElementNotInteractableException是一個常見的異常,它通常發生在嘗試與網頁上的某個元素進行交互(例如點擊、輸入等操作)時,但由于該元素當前不可交互。這可能由多種原因引起,以下是一些常見的原因及其解決方法: 元素未完全加載 如果嘗試與頁面上的元素交…

如何從 GitHub 鏡像倉庫到極狐GitLab?

最近 GitHub 封禁中國用戶的事情鬧得沸沸揚揚,雖然官方發布的報道說中國用戶被限制登錄是因為配置錯誤導致,已經撤回了更新,中國用戶已經可以正常使用。但是這就像橫在國內開發者和企業頭上的“達摩克利斯之劍”。為了避免 GitHub 不可用而帶來的影響,國內開發者和企業可以…

服務器安裝nacos

1.下載依賴 docker pull nacos/nacos-server:v2.4.3安裝 docker run -d --name nacos-server -p 8848:8848 -e MODEstandalone nacos/nacos-server:v2.4.3把nacos中的data 文件和conf 文件copy到自己服務的文件夾 docker cp nacos-server:/home/nacos/data /home/admin1/…

Matter協議暗戰:蘋果、谷歌、亞馬遜的智能家居霸權爭奪

原文地址&#xff1a;Matter協議暗戰&#xff1a;蘋果、谷歌、亞馬遜的智能家居霸權爭奪 一、Matter 協議&#xff1a;巨頭聯手打造的 “智能家居聯合國” 1.1 從 CHIP 到 Matter&#xff1a;標準統一的十年長跑 智能家居發展多年&#xff0c;卻始終被 “孤島效應” 困擾。各…

軟件設計師2009-2022歷年真題與答案解析(附pdf下載)

軟考在即&#xff0c;現在給大家分享一下軟件設計師2009-2022真題與答案解析 pdf全套&#xff0c;文末提供大家免費下載&#xff0c;大家都知道在軟考備考過程中&#xff0c;擁有一套全面且實用的考試資料對于考生來說至關重要。目錄如下&#xff1a; 歷年真題及詳解2004-2019 …

基于EasyX庫開發的球球大作戰游戲

目錄 球球大作戰 一、開發環境 二、流程圖預覽 三、代碼邏輯 1、初始化時間 2、設置開始界面大小 3、設置開始界面 4、讓玩家選擇速度 5、設置玩家小球、人機小球、食物的屬性 6、一次性把圖繪制到界面里 7、進入死循環 8、移動玩家小球 9、移動人機 10、食物刷新…

aslist和list的區別

?Arrays.asList和List的主要區別在于它們的固定長度和不可變性、與原始數組的關系、性能以及使用場景。 一、固定長度和不可變性 ?Arrays.asList?&#xff1a;通過Arrays.asList方法創建的List是一個固定長度的List&#xff0c;其長度與原始數組相同。這意味著你不能通過添…

大模型預標注和自動化標注在OCR標注場景的應用

OCR&#xff0c;即光學字符識別&#xff0c;簡單來說就是利用光學設備去捕獲圖像并識別文字&#xff0c;最終將圖片中的文字轉換為可編輯和可搜索的文本。在數字化時代&#xff0c;OCR&#xff08;光學字符識別&#xff09;技術作為處理圖像中文字信息的關鍵手段&#xff0c;其…

stm32工程,拷貝到另一臺電腦編譯,錯誤提示頭文件找不到cannot open source input file “core_cm4.h”

提示 cannot open source input file “core_cm4.h” ,找不到 [ core_cm4.h ] 這個頭文件 . 于是我在原電腦工程文件里找也沒有找到這個頭文件 接下來查看原電腦keil的頭文件引入配置,發現只引入了工程文件下的頭文件, 那么core_cm4.h到底哪里來的? (到現在我也不清楚怎…

STM32 模塊化開發指南 · 第 2 篇 如何編寫高復用的外設驅動模塊(以 UART 為例)

本文是《STM32 模塊化開發實戰指南》的第 2 篇,聚焦于“串口驅動模塊的設計與封裝”。我們將從一個最基礎的裸機 UART 初始化開始,逐步實現:中斷支持、環形緩沖收發、模塊接口抽象與測試策略,構建一個可移植、可擴展、可復用的 UART 驅動模塊。 一、模塊化 UART 的設計目標…

【NLP 59、大模型應用 —— 字節對編碼 bpe 算法】

目錄 一、詞表的構造問題 二、bpe(byte pair encoding) 壓縮算法 算法步驟 示例&#xff1a; 步驟 1&#xff1a;初始化符號表和頻率統計 步驟 2&#xff1a;統計相鄰符號對的頻率 步驟 3&#xff1a;合并最高頻的符號對 步驟 4&#xff1a;重復合并直至終止條件 三、bpe在NLP中…

TMS320F28P550SJ9學習筆記15:Lin通信SCI模式結構體寄存器

今日初步認識與配置使用Lin通信SCI模式&#xff0c;用結構體寄存器的方式編程 文章提供完整工程下載、測試效果圖 我的單片機平臺是這個&#xff1a; LIN通信引腳&#xff1a; LIN通信PIE中斷&#xff1a; 這個 PIE Vector Table 表在手冊111頁&#xff1a; 這是提到LINa的PI…

linux-設置每次ssh登錄服務器的時候提醒多久需要修改密碼

在 Linux 系統中,你可以通過設置 motd(Message of the Day)或 sshd 配置來在用戶通過 SSH 登錄時提醒他們密碼即將過期。以下是具體步驟: 方法 1: 使用 motd 文件 motd 文件在用戶登錄時顯示,你可以通過腳本動態生成內容,提醒用戶密碼過期時間。 編輯 /etc/motd 文件:…

matlab求和∑函數方程編程?

matlab求和∑函數方程編程&#xff1f; 一 題目&#xff1a;求下列函數方程式的和 二&#xff1a;代碼如下&#xff1a; >> sum_result 0; % 初始化求和變量 for x 1:10 % 設…

electron桌面端開發-打開指定軟件和文件

electron桌面端開發 現在越來越多的軟件開發已經趨向于簡單化&#xff0c;桌面端開發已經不在依賴之前的java、c等主流技術&#xff0c;目前基于node的開發越來越廣泛。功能點也越來越多元化。 文章目錄 electron桌面端開發前言一、打開文件的方式&#xff1f;二、exec使用步驟…

ShenNiusModularity項目源碼學習(17:ShenNius.Admin.Mvc項目分析-2)

ShenNiusModularity項目的后臺管理主頁面如下圖所示&#xff0c;該頁面為ShenNius.Admin.Mvc項目的Views\Home\Index.cshtml&#xff0c;使用的是layuimini后臺模板&#xff08;參考文獻2&#xff09;&#xff0c;在layuimini的GitHub主頁中提供有不同樣式的頁面模版鏈接&#…

SpringBoot 與 Vue3 實現前后端互聯全解析

在當前的互聯網時代&#xff0c;前后端分離架構已經成為構建高效、可維護且易于擴展應用系統的主流方式。本文將詳細介紹如何利用 SpringBoot 與 Vue3 構建一個前后端分離的項目&#xff0c;展示兩者如何通過 RESTful API 實現無縫通信&#xff0c;讓讀者了解從環境搭建、代碼實…

portainer.io篇

Portainer?是一個輕量級的容器管理工具&#xff0c;支持Docker、Kubernetes、Docker Swarm、ACI和Nomad等多種平臺。它提供了一個直觀的Web界面&#xff0c;使用戶能夠輕松地管理和監控容器&#xff0c;包括創建、啟動、停止、刪除容器&#xff0c;以及查看容器的日志和配置信…

Dockerfile 文件常見命令及其作用

Dockerfile 文件包含一系列命令語句&#xff0c;用于定義 Docker 鏡像的內容、配置和構建過程。以下是一些常見的命令及其作用&#xff1a; FROM&#xff1a;指定基礎鏡像&#xff0c;后續的操作都將基于該鏡像進行。例如&#xff0c;FROM python:3.9-slim-buster 表示使用 Pyt…