【Linux】調試器——gdb使用

目錄

一、預備知識

二、常用指令

三、調試技巧

(一)監視變量的變化指令 watch

(二)更改指定變量的值 set var


正文

一、預備知識

程序的發布形式有兩種,debug和release模式,Linux gcc/g++出來的二進制程序默認是release模式。

要使用gdb調試,必須在源代碼生成二進制程序的時候加上-g 選項,如果沒有程序無法編譯。

gdb還有個不友好的點是調試時無法直接看到源碼,所以使用cgdb調試器。


以下是調試中用到的代碼,先創建一個mycmd.c文件將下面代碼寫入,gcc mycmd.c -o mycmd生成可執行文件然后開啟我們的調試之旅

二、常用指令

(1)進入cgdb?調試界面

cgdb?文件名:cgdb mycmd

(2)顯示源代碼:list/l

list/l:?????????????????????????????顯示源代碼

list/l?函數名:?????????????????列出指定函數的源代碼? ? ? ? ?list/l main

list/l 文件名:行號 :????????列出指定文件的源代碼?????????list/l mycmd.c:1

(3)退出指令:quit

(4)打斷點指令:break/b

break/b 行號:?在指定行設置斷點,該行數會有高亮提醒,對應VS調試中的F9操作

? ? ? ??

(5)查看斷點指令: info b/break

info b:查看所有斷點信息,前面的1、2...數字表示斷點的個數編號,編號根據打斷點次數依次遞增不受刪除斷點影響

(6)刪除斷點指令:delete/d

d 斷點編號:刪除斷點必須通過編號刪除,要知道編號得先執行查看獲取

刪除第2編號斷點,再次查看已沒編號2

(7)刪除所有斷點指令:delete/d? breakpoints

(8)從程序開始連續執行指令:run/r

第一:gdb啟動調試時只是開啟了gdb,程序并沒有被調試起來必須輸入r

第二:run/r表示在gdb場景中啟動我們的程序mycmd

第三:在沒打任何斷點的情況下run/r從頭開始執行程序

第四:有斷點run/r執行程序時跳到第一個斷點處開始執行

(9)逐過程調試指令:n/next

單步執行,不進入函數內部,對應VS調試中的F10

(10)逐語句調試指令:s/step

單步執行,進入函數內部,對應VS調試中的F11

(11)跟蹤變量值的指令:display 變量名

在循環過程中想觀察變量的數值變化可以使用此語句,display后最前面的數字表示變量編號,對應VS調試中的監視窗口

(12)取消變量值跟蹤指令:undisplay 編號

需要通過變量編號刪除

(13)執行到指定行號指令:until 目標行號

如果在調試過程中循環語句要執行100次,而你又確定報錯一定不在循環中,可以until+目標行號,直接執行完循環到指定行處

(14)運行到下一個斷點處指令:continue/c

運行到下一個斷點處或直接運行結束

(15)查看當前棧各級函數調用及參數:bt

程序執行到函數時會向棧申請空間,這句代碼旨在查看當前執行到這堆棧被調用情況,以下代碼只有一個sum函數。

對應VS調試中的堆棧調用監視窗口

(16)查看當前棧幀的局部變量值:info i

也就是當前在debug下的程序信息

(17)禁用所有斷點指令:disable breakpoints

為什么禁用斷點而不直接刪除:調試過程中你可能沒有發現問題,并且程序還跑得過去可當你關閉調試,執行代碼時程序又報錯,如果你直接刪除斷點無法在之前的調試基礎上再次調試,所以禁用斷點是為了保留調試痕跡。

沒被禁用的斷點在查看時Enb下顯示y:

disable breakpoints禁用所有斷點后Enb下顯示n:

(18)啟用所有斷點指令:enable?breakpoints

以上的18點調試技巧足以讓我們進行代碼調試,有興趣的同學可以繼續了解更多其他調試語句~

三、調試技巧

(一)監視變量的變化指令:watch

在整個程序中你有定義一些靜態變量或者一些不應該修改的變量,但你懷疑它修改了導致程序報錯,你可以watch它,如果這個變量在運行過程中變了就會通知你

所以斷點的類型除了breakpoint 還有watchpoint的形式

(二)更改指定變量的值:set var

指的是在調試中你懷疑導致代碼出錯的是某個原本不可變變量值,而你此時只是猜測不想直接動源代碼改值,可以使用set var更改變量值看是否還報錯。

假設你的源碼中flag=0,你猜測要是把flag改成1可能不會再報錯,于是你使用以下語句修改flag=1,而真實的源碼還是flag=0。如果程序調試不報錯,你再去修改源碼為flag=1。


以上是gdb的基礎調試語句,看到這希望對你有幫助。

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

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

相關文章

【Ubuntu常用命令】

1.將本地服務器文件或文件夾傳輸到遠程服務器 文件 scp /data/a.txt administrator10.60.51.20:/home/administrator/ 文件夾 scp -r /data/ administrator10.60.51.20:/home/administrator/ 2.從遠程服務器傳輸文件到本地服務器 scp administrator10.60.51.20:/data/a.txt /h…

golang 的time包的常用方法

目錄 time 包方法總結 類型 time.Time 的方法 庫函數 代碼示例: time 包方法總結 類型 time.Time 的方法 方法名描述示例               ?Now()獲取當前時間和日期time.Now()Format()格式化時間為字符串time.Now().Format("2006-01-02 15…

Elasticsearch:使用 Azure AI 文檔智能解析 PDF 文本和表格數據

作者:來自 Elastic James Williams 了解如何使用 Azure AI 文檔智能解析包含文本和表格數據的 PDF 文檔。 Azure AI 文檔智能是一個強大的工具,用于從 PDF 中提取結構化數據。它可以有效地提取文本和表格數據。提取的數據可以索引到 Elastic Cloud Serve…

【ArcGIS操作】ArcGIS 進行空間聚類分析

ArcGIS 是一個強大的地理信息系統(GIS)軟件,主要用于地理數據的存儲、分析、可視化和制圖 啟動 ArcMap 在 Windows 中,點擊“開始”菜單,找到 ArcGIS文件夾,然后點擊 ArcMap 添加數據 添加數據 - 點擊工具…

RabbitMQ消息相關

MQ的模式: 基本消息模式:一個生產者,一個消費者work模式:一個生產者,多個消費者訂閱模式: fanout廣播模式:在Fanout模式中,一條消息,會被所有訂閱的隊列都消費。 在廣播…

緩存使用紀要

一、本地緩存:Caffeine 1、簡介 Caffeine是一種高性能、高命中率、內存占用低的本地緩存庫,簡單來說它是 Guava Cache 的優化加強版,是當下最流行、最佳(最優)緩存框架。 Spring5 即將放棄掉 Guava Cache 作為緩存機…

2025年3月29日筆記

問題&#xff1a;創建一個長度為99的整數數組&#xff0c;輸出數組的每個位置數字是幾&#xff1f; 解題思路&#xff1a; 1.因為題中沒有明確要求需要輸入,所以所有類型的答案都需要寫出 解法1&#xff1a; #include<iostream> #include<bits/stdc.h> using n…

hadoop相關面試題以及答案

什么是Hadoop&#xff1f;它的主要組件是什么&#xff1f; Hadoop是一個開源的分布式計算框架&#xff0c;用于處理大規模數據的存儲和計算。其主要組件包括Hadoop Distributed File System&#xff08;HDFS&#xff09;和MapReduce。 解釋HDFS的工作原理。 HDFS采用主從架構&…

微信小程序:數據拼接方法

1. 使用 concat() 方法拼接數組 // 在原有數組基礎上拼接新數組 Page({data: {originalArray: [1, 2, 3]},appendData() {const newData [4, 5, 6];const combinedArray this.data.originalArray.concat(newData);this.setData({originalArray: combinedArray});} }) 2. 使…

Python之貪心算法

Python實現貪心算法(Greedy Algorithm) 概念 貪心算法是一種在每一步選擇中都采取當前狀態下最優的選擇&#xff0c;從而希望導致結果是全局最優的算法策略。 基本特點 局部最優選擇&#xff1a;每一步都做出當前看起來最佳的選擇不可回退&#xff1a;一旦做出選擇&#xf…

【 <二> 丹方改良:Spring 時代的 JavaWeb】之 Spring Boot 中的 AOP:實現日志記錄與性能監控

<前文回顧> 點擊此處查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、開篇整…

TCP/IP協議簇

文章目錄 應用層http/httpsDNS補充 傳輸層TCP1. 序列號與確認機制2. 超時重傳3. 流量控制&#xff08;滑動窗口機制&#xff09;4. 擁塞控制5. 錯誤檢測與校驗6. 連接管理總結 網絡層ARP**ARP 的核心功能**ARP 的工作流程1. ARP 請求&#xff08;Broadcast&#xff09;2. ARP 緩…

SpringBoot分布式項目訂單管理實戰:Mybatis最佳實踐全解

一、架構設計與技術選型 典型分布式訂單系統架構&#xff1a; [網關層] → [訂單服務] ←→ [分布式緩存]↑ ↓ [用戶服務] [支付服務]↓ ↓ [MySQL集群] ← [分庫分表中間件]技術棧組合&#xff1a; Spring Boot 3.xMybatis-Plus 3.5.xShardingSpher…

微服務架構中的精妙設計:環境和工程搭建

一.前期準備 1.1開發環境安裝 Oracle從JDK9開始每半年發布?個新版本, 新版本發布后, ?版本就不再進?維護. 但是會有?個?期維護的版本. ?前?期維護的版本有: JDK8, JDK11, JDK17, JDK21 在 JDK版本的選擇上&#xff0c;盡量選擇?期維護的版本. 為什么選擇JDK17? S…

Maven 構建配置文件詳解

Maven 構建配置文件詳解 引言 Maven 是一個強大的項目管理和構建自動化工具,廣泛應用于 Java 開發領域。在 Maven 項目中,配置文件扮演著至關重要的角色。本文將詳細介紹 Maven 構建配置文件的相關知識,包括配置文件的作用、結構、配置方法等,幫助讀者更好地理解和應用 M…

【YOLO系列】基于YOLOv8的無人機野生動物檢測

基于YOLOv8的無人機野生動物檢測 1.前言 在野生動物保護、生態研究和環境監測領域&#xff0c;及時、準確地檢測和識別野生動物對于保護生物多樣性、預防人類與野生動物的沖突以及制定科學的保護策略至關重要。傳統的野生動物監測方法通常依賴于地面巡邏、固定攝像頭或無線傳…

Hive UDF開發實戰:構建高性能JSON生成器

目錄 一、背景與需求場景 二、開發環境準備 2.1 基礎工具棧 2.2 Maven依賴配置 三、核心代碼實現

分布式特性對比

以下是關于 分片(Sharding)、一致性哈希、兩階段提交(2PC)、Paxos、Raft協議、數據局部性 的對比分析與關聯性總結,涵蓋核心機制、適用場景及相互關系: 一、概念對比與關聯 概念核心目標關鍵特性典型應用場景與其它技術的關聯分片(Sharding)數據水平拆分按規則(哈希、…

歷史分鐘高頻數據

外盤期貨高頻分鐘歷史回測行情數據下載 鏈接: https://pan.baidu.com/s/1RUbAMxfiSyBlXfrwT_0n2w?pwdhgya 提取碼: hgya通過美國期貨高頻交易所歷史行情可以看到很多細節比如品種之一&#xff1a;FGBX_1min (1)在2024-02-29 11:14:00關鍵交易時刻&#xff0c;一筆大規模訂單突…

final+模版設計模式的理解

模板設計模式在 Java 里是一種行為設計模式&#xff0c;它在抽象類里定義算法的骨架&#xff0c;把部分步驟的具體實現延遲到子類。如此一來&#xff0c;子類可以在不改變算法結構的基礎上&#xff0c;重新定義算法中的特定步驟。 模式組成 抽象類&#xff08;Abstract Class…