Linux中:調試器gdb/cgdb的使用

引言

? ? ? ? 在追尋光的路上不斷前行,詳細介紹Linux下gdb/cgdb的使用。

一、準備

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

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

二、調試

1.進入調試界面

進入調試命令:gdb/cgdb? 可執行文件??

例如:

[zhangsan@hcss-ecs-f571 learn_25_9_12]$ cgdb code5x int Sum(int s, int e)6x {7x     int result = 0;8x     int i = 0;9x     for(i = s; i <= e; i++)
10x     {
11x         result += i;
12x     }
13x     return result*flag;
14x }
15x
16x int main()
17x {
18t>    int start = 1;
19x     int end = 100;
20x     printf("I will begin\n");
21x     int n = Sum(start, end);
22x     printf("running done, result is: [%d-%d]=%d\n", start, end, n);
23x     return 0;
24x }
?                                                                                                                                                               [?1034h[?1034hGNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/zhangsan/learn_25_9_12/code...done.
(gdb) 
Temporary breakpoint 1 at 0x4005c3: file code.c, line 18.
(gdb)

2.退出調試界面

命令:quit/q? 退出調試界面

3.開始調試

? ? ?? ?輸入r/run開始調試,默認會直接將代碼跑完,所以就需要打斷點

4.打斷點

? ? ? ? 輸入 b/break [文件名]:行號? ? 或

? ? ? ? 輸入 b/break 行號

來打斷點

? ? ? ? 命令:info/i? ??b/break? ? ?可以查看有哪些斷點

然后輸入r/run,程序運行時會從第一個斷點開始運行。

[zhangsan@hcss-ecs-f571 learn_25_9_12]$ cgdb code5x int Sum(int s, int e)6x {7x     int result = 0;8x     int i = 0;9x     for(i = s; i <= e; i++)
10x     {
11x         result += i;
12x     }
13x     return result*flag;
14x }
15x
16x int main()
17x {
18x     int start = 1;
19x     int end = 100;
20t>    printf("I will begin\n");
21x     int n = Sum(start, end);
22x     printf("running done, result is: [%d-%d]=%d\n", start, end, n);
23x     return 0;
24x }
/home/zhangsan/learn_25_9_12/code.c                                                                                                                             
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/zhangsan/learn_25_9_12/code...done.
(gdb) b	20
Breakpoint 1 at 0x4005d1: file code.c, line 20.
(gdb) b	22
Breakpoint 2 at 0x4005ed: file code.c, line 22.
(gdb) info b
Num     Type           Disp Enb Address            What
1	breakpoint     keep y   0x00000000004005d1 in main at code.c:20
2	breakpoint     keep y   0x00000000004005ed in main at code.c:22
(gdb) r
Starting program: /home/zhangsan/learn_25_9_12/code Breakpoint 1, main () at code.c:20
Missing separate debuginfos, use: debuginfo-install glibc-2.17-326.el7_9.3.x86_64
(gdb) 

4.1打條件斷點

命令:b/break 行號 if 條件

如:b 11 if i == 10

(gdb) b	11 if i==10
Breakpoint 3 at 0x40059d: file code.c, line 11.
(gdb) info b
Num     Type           Disp Enb Address            What
1	breakpoint     keep y   0x00000000004005d1 in main at code.c:20breakpoint already hit 1 time
2	breakpoint     keep y   0x00000000004005ed in main at code.c:22
3	breakpoint     keep y   0x000000000040059d in Sum at code.c:11stop only if i==10
(gdb) 

4.2給已存在的斷點新增條件

命令:condition [條件序號] [條件]

如:condition 11 i == 10

解釋:條件序號就是info b命令后,Num對應的數子。

(gdb) info b
Num     Type           Disp Enb Address            What
1	breakpoint     keep y   0x000000000040059d in Sum at code.c:11
(gdb) condition	1 i == 10
(gdb) info b
Num     Type           Disp Enb Address            What
1	breakpoint     keep y   0x000000000040059d in Sum at code.c:11stop only if i == 10
(gdb) 

5.逐過程調試,逐語句調試

?命令:n/next? ?單步執行,不進入函數內部,逐過程(F10)

?命令:s/step? ?單步執行,進入函數內部,逐語句(F11)

6.跳到下一個斷點調試

命令:c/continue? ?從當前位置開始連續執行程序(一個斷點跳到下一個斷點)

7.查看調試變量信息

命令:p [變量名]? ? ? ? ?打印指定變量的值

命令:display [變量名]? ? ?跟蹤顯示變量的值

命令:undisplay [編號]? ?取消對指定編號的變量的跟蹤顯示

(gdb) display i
1: i = 4195472
(gdb) n
1: i = 4195472
(gdb) 
1: i = 0
(gdb) 
1: i = 1
(gdb) 
1: i = 1
(gdb) 
1: i = 2
(gdb) 
1: i = 2
(gdb) 
1: i = 2
(gdb) undisplay	1
(gdb) n
(gdb) 

8.禁用斷點,啟用斷點

命令:disable [編號]? ? ?禁用[編號]斷點

命令:disable breakpoints? ? 禁用所有斷點

命令:enable [編號]? ?啟用[編號]斷點

命令:enable? breakpoints? ?啟用所有斷點

(gdb) i	b
Num     Type           Disp Enb Address            What
1	breakpoint     keep y   0x00000000004005db in main at code.c:21breakpoint already hit 1 time
2	breakpoint     keep n   0x000000000040059d in Sum at code.c:10
(gdb) disable breakpoints
(gdb) i	b
Num     Type           Disp Enb Address            What
1	breakpoint     keep n   0x00000000004005db in main at code.c:21breakpoint already hit 1 time
2	breakpoint     keep n   0x000000000040059d in Sum at code.c:10
(gdb) enable breakpoints 
(gdb) i	b
Num     Type           Disp Enb Address            What
1	breakpoint     keep y   0x00000000004005db in main at code.c:21breakpoint already hit 1 time
2	breakpoint     keep y   0x000000000040059d in Sum at code.c:10
(gdb)     

9.刪除斷點

命令:delete/d [編號]? ?刪除[編號]斷點

命令:delete/d breakpoints? ?刪除所以斷點

三、一些調試小技巧

命令:list/l? ?顯示源代碼,從上次位置開始,每次列出 10行

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

命令:list/l? 文件名:行號? ? ?列出指定文件位置的源代碼? ?如:l code.c? main

命令:finish? ? ?執行到當前函數返回,然后停止

如:在sum函數中執行時,輸入finish可以直接將sum函數執行完并返回,

若sum函數中有斷點,則執行到斷點位置處停止。

命令:p/print? [表達式]? ?打印表達式的值? ? ? ? ?如:print? x+y

命令:until? 行號? ? ? ? 執行到指定行號? ? ? ? ?如:until? 20

命令:backtrace/bt? ?查看當前執行棧的各級函數調用及參數

命令:info/i locals? ?查看當前棧幀的局部變量值? ? ? ? ? ? ? ? ??

(gdb) s
Sum (s=1, e=100) at code.c:7
(gdb) bt
#0  Sum (s=1, e=100) at code.c:7
#1  0x00000000004005ea in main () at code.c:21
(gdb) i	locals
result = 0
i = 4195472
(gdb) 

命令:watch

????????執行時監視?個表達式(如變量)的值。如果監視的表達式在程序運行期間的值發生變化,GDB會暫停程序的執行,并通知使用者

Sum (s=1, e=100) at code.c:9
(gdb) 
(gdb) 
Hardware watchpoint 3: resultOld value = 1
New value = 3
Sum (s=1, e=100) at code.c:9
(gdb) 
(gdb) 
Hardware watchpoint 3: resultOld value = 3
New value = 6
Sum (s=1, e=100) at code.c:9
(gdb) 
Breakpoint 4 at 0x400595: file code.c, line 9.
(gdb) Quit
(gdb) 

命令:set var [修改的條件]

? ? ? ? 可以在調試的時候暫時修改變量的值,方便確定問題在哪塊。

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

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

相關文章

【算法】【鏈表】148.排序鏈表--通俗講解

算法通俗講解推薦閱讀 【算法–鏈表】83.刪除排序鏈表中的重復元素–通俗講解 【算法–鏈表】刪除排序鏈表中的重復元素 II–通俗講解 【算法–鏈表】86.分割鏈表–通俗講解 【算法】92.翻轉鏈表Ⅱ–通俗講解 【算法–鏈表】109.有序鏈表轉換二叉搜索樹–通俗講解 【算法–鏈表…

計算機組成原理:存儲系統概述

&#x1f4cc;目錄&#x1f4be; 存儲系統概述&#xff1a;計算機的“記憶中樞”&#x1f3d7;? 一、存儲系統的層次結構&#xff1a;速度與容量的“黃金平衡”&#xff08;一&#xff09;經典存儲層次金字塔&#xff08;二&#xff09;層次結構的設計原則&#xff08;三&…

基于CNN/CRNN的漢字手寫體識別:從圖像到文字的智能解碼

在人工智能浪潮的推動下&#xff0c; handwriting recognition&#xff08;手寫識別&#xff09;技術已成為連接傳統書寫與數字世界的重要橋梁。其中&#xff0c;漢字手寫體識別因其字符集的龐大和結構的復雜性&#xff0c;被視為模式識別領域最具挑戰性的任務之一。近年來&…

【無人機】無人機用戶體驗測試策略詳細介紹

一、 道&#xff1a;核心測試理念與目標核心理念&#xff1a; 用戶體驗測試的核心不是尋找功能Bug&#xff0c;而是評估用戶在與無人機系統&#xff08;包括飛行器、遙控器、APP&#xff09;交互全過程中的主觀感受、操作效率、情感變化和達成目標的難易度。我們的目標是讓科技…

@RequiredArgsConstructor使用

spring推薦通過構造方法進行注入&#xff0c;如果需要注入的成員變量較多&#xff0c;手動創建構造方法可能需要頻繁修改&#xff0c;這時&#xff0c;可以使用RequiredArgsConstructor。RequiredArgsConstructor是lombok中提供的注解&#xff0c;可以為類中final或者NotNull修…

TA-VLA——將關節力矩反饋融入VLA中:無需外部力傳感器,即可完成汽車充電器插入(且可多次自主嘗試)

前言 今25年9.13日&#xff0c;我在微博上寫道&#xff1a; “我們為何24年起聚焦具身開發呢 23年我們做了一系列大模型應用&#xff0c;發覺卷飛了&#xff0c;c端搞不過大廠的工程迭代 流量獲取&#xff0c;b端拼不過大廠的品牌&#xff0c;且大廠外 人人都可以搞 ?然&…

數據驅動破局商業信息不對稱:中國商業查詢平臺的技術實踐與方法論心得

前言 在當前中國經濟高質量發展的浪潮中,企業數量已突破5000萬戶(截至2024年數據,延續2021年超5億用戶查詢需求的增長趨勢),但“企業質量參差、信息不透明”的痛點始終困擾著市場主體——企業合作前怕踩坑、個人求職擔心“皮包公司”、投資者規避壞賬風險,這些需求的核心…

光譜相機的圖像模式

光譜相機通過不同的成像方式獲取目標的光譜信息&#xff0c;主要分為以下幾種圖像模式&#xff1a;一、按成像方式分類?點掃描模式&#xff08;Whiskbroom&#xff09;?工作原理&#xff1a;逐點掃描目標區域&#xff0c;每個點獲取完整光譜曲線特點&#xff1a;光譜分辨率最…

連接器上的pin針和膠芯如何快速組裝?

在連接器生產過程中&#xff0c;pin 針與膠芯的組裝是核心環節 —— 人工組裝不僅效率低&#xff08;單組耗時約 15-20 秒&#xff09;&#xff0c;還易因對齊偏差導致 pin 針彎曲、膠芯卡滯&#xff0c;不良率高達 3%-5%。針對這一問題&#xff0c;可通過 “機器精準排列 定制…

Zynq-7000與Zynq-MPSoC 的 AXI 接口對比

Zynq 與 Zynq UltraScale MPSoC 的的 AXI 接口對比 1. 總體架構差異Zynq-7000 雙核 ARM Cortex-A9 (PS) 7 系列 FPGA (PL)PS–PL 之間主要通過 AXI 總線通訊提供 GP (General Purpose)、HP (High Performance)、ACP (Accelerator Coherency Port) 等接口ZynqMP (UltraScale MP…

關鍵字 - 第六講

前文補充#include <iostream> using namespace std;int main() {int a 10;int c 20; // 將變量c定義在switch語句之前switch(a){case 1:{cout << ".........." << endl;cout << c << endl;}break;default:cout << ".....…

Linux相關概念和易錯知識點(43)(數據鏈路層、ARP、以太網、交換機)

目錄1.從網絡層到數據鏈路層&#xff08;1&#xff09;MAC地址&#xff08;2&#xff09;IP地址和MAC地址的區別&#xff08;3&#xff09;ARP&#xff08;4&#xff09;不同層之間的關系2.以太網&#xff08;1&#xff09;以太網的幀格式&#xff08;2&#xff09;數據分片的原…

【科研繪圖系列】R語言繪制多擬合曲線圖

禁止商業或二改轉載,僅供自學使用,侵權必究,如需截取部分內容請后臺聯系作者! 文章目錄 介紹 加載R包 數據下載 函數 導入數據 數據預處理 畫圖 總結 系統信息 介紹 本文通過R語言對海洋微生物群落的動態變化進行了深入分析,并通過可視化技術直觀展示了不同環境條件下微…

【React】React 哲學

1. 聲明式&#xff08;Declarative&#xff09; React 鼓勵開發者 描述 UI 應該是什么樣子&#xff0c;而不是逐步操作 DOM。 // 聲明式 function Greeting({ name }) {return <h1>Hello, {name}</h1>; }不用手動操作 DOM&#xff08;document.getElementById / in…

一、Python開發準備

目錄 一、前言 1、什么是python&#xff0c;為什么學習python? 2、python語言的特點&#xff0c;以及應用場景是什么&#xff1f; 二、前期準備 1、下載python 2、右鍵管理員身份安裝 3、將Python環境配置到環境變量中 三、開發工具 1、開發工具介紹 一、前言 1、什么…

Visual Studio 發布項目 win-86 win-64 win-arm win-arm64 osx-64 osx-64 osx-arm64 ...

Visual Studio 發布項目時&#xff0c;常見的目標平臺標識符代表不同的操作系統和處理器架構組合[TOC]( Visual Studio 發布項目時&#xff0c;常見的目標平臺標識符代表不同的操作系統和處理器架構組合) 以下是詳細解釋及對比列表&#xff1a;一、基礎概念解析二、各平臺標識符…

Redis數據結構之Hash

一、Hash類型簡介 Redis的Hash類型是 Redis 3.2 版本引入的一個數據結構,它允許你在一個鍵下面存儲多個字段和值。在 Redis 內部,Hash 類型可以有多種底層數據結構來實現,這取決于存儲的數據量和特定的使用模式。哈希類型適用于存儲對象,例如用戶信息、商品詳情等。通過使…

【Linux系統】初見線程,概念與控制

前言&#xff1a; 上文我們講到了進程間信號的話題【Linux系統】萬字解析&#xff0c;進程間的信號-CSDN博客 本文我們再來認識一下&#xff1a;線程&#xff01; Linux線程概念 什么是線程 概念定義&#xff1a; 進程內核數據結構代碼和數據&#xff08;執行流&#xff09; 線…

計算機視覺與深度學習 | 具身智能研究綜述:從理論框架到未來圖景

具身智能研究綜述:從理論框架到未來圖景 文章目錄 具身智能研究綜述:從理論框架到未來圖景 一、定義與核心特征 二、關鍵技術體系 2.1 感知-運動融合技術 2.2 認知架構 2.3 強化學習進展 三、發展歷程與里程碑 3.1 理論奠基期(1990-2005) 3.2 技術探索期(2006-2015) 3.3 …

玩轉deepseek之自動出試卷可直接導出word

小伙伴們&#xff0c;最近有新同事入職&#xff0c;經理讓我出一個關于sqlserver相關的試卷&#xff0c;想著既然有deepseek&#xff0c;我們就偷懶下直接用deepseek給我們自動生成出來。打開deepseek官網&#xff0c;輸入提示詞&#xff1a;出一套SQL的試題要有基礎考察&#…