引言

        在追寻光的路上不断前行,详细介绍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的试题要有基础考察&#…