【Linux调试器-gdb使用】

news2024/9/27 19:23:31

目录

1. 背景

2. 使用

 3 命令总结


1. 背景

通过c语言的学习我们知道程序的发布方式有两种,debug模式和release模式,debug模式就是我们所说的调试模式。我们已经熟悉了在Windows平台下VS系列的调试,接下来我们一起在无图形化界面的Linux下来看看究竟如何调试吧!


2. 使用

首先我们先创建一个c++文件,并向里面写入代码:

 #include<iostream>
  2 using namespace std;
  3 
  4 int AddSum(int& n)                                                                                                                      
  5 {
  6   int sum=0;
  7   for(int i=1;i<=n;i++)
  8   {
  9     sum+=i;
 10   }
 11   return sum;
 12 }
 13 
 14 int main()
 15 {
 16   int num=10;
 17   int sum=AddSum(num);
 18   cout<<sum<<endl;
 19   return 0;
 20 }

运行一下:

[grm@VM-8-12-centos lesson3]$ g++ test.cpp
[grm@VM-8-12-centos lesson3]$ ll
total 16
-rwxrwxr-x 1 grm grm 8960 Jan  4 22:12 a.out
-rw-rw-r-- 1 grm grm  219 Jan  4 22:11 test.cpp
[grm@VM-8-12-centos lesson3]$ ./a.out
55

然后为其增加调试信息:

我们可以明显观察到加入了调试信息后文件的大小明显发生了改变:

注意:要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项

接下来就开始调试:gdb+binFile (可执行文件)

退出: ctrl + d quit
[grm@VM-8-12-centos lesson3]$ gdb a.out
GNU 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/grm/lesson3/a.out...done.
(gdb) l
7	  for(int i=1;i<=n;i++)
8	  {
9	    sum+=i;
10	  }
11	  return sum;
12	}
13	
14	int main()
15	{
16	  int num=10;
(gdb) r
Starting program: /home/grm/lesson3/a.out 
55
[Inferior 1 (process 11983) exited normally]
Missing separate debuginfos, use: debuginfo-install glibc-2.17-326.el7_9.x86_64 libgcc-4.8.5-44.el7.x86_64

这里的l表示:list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。

r:  r或run:运行程序 (类似于VS中的f5)

再来介绍两个比较常用的命令:n 和 s

n 或 next:单条执行   (逐过程,VS下为f10)
s或step:进入函数调用  (逐语句,VS下为f11)

在介绍这两个命令前还得介绍一个打断点的命令,break(b) 行号:在某一行设置断点

当然还可以在指定文件中某一行或者某个函数打断点也是可行的:b 文件名:函数名(行号)

 我们不妨在第九行设置一个断点,然后ran起来到第九行,通过逐过程来走读代码:

 但是我们发现现在并不能够观察到变量的值,那应该怎么办呢?

我们可以用 display 变量名:跟踪查看一个变量,每次停下来都显示它的值

(gdb) display sum
1: sum = 1
(gdb) display i
2: i = 1
(gdb) n

Breakpoint 1, AddSum (n=@0x7fffffffe448: 10) at test.cpp:9
9	    sum+=i;
2: i = 2
1: sum = 1
(gdb) n
7	  for(int i=1;i<=n;i++)
2: i = 2
1: sum = 3
(gdb) n

Breakpoint 1, AddSum (n=@0x7fffffffe448: 10) at test.cpp:9
9	    sum+=i;
2: i = 3
1: sum = 3

当我们通过display展示变量名时可以发现每次逐过程进行的时候都将会把display的变量打印出来。取消的话就用 undisplay + 变量名。

我们还可以用until来跳转至想要跳转的行数:until X行号:跳至X行

会将程序运行到我们跳转到的行数。

假如我们想要只跑过该函数就停下来就可以用:finish

从一个断点运行到另外一个断点就用:continue(c)


 3 命令总结

另外还有一些指令大家可以下去自己研究,我这里列了一个表格方便大家参考:

list l 行号
显示 binFile 源代码,接着上次的位置往下列,每次列 10 行。
list l 函数名
列出某个函数的源代码
r run
运行程序
n next
单条执行(逐过程)
s step
进入函数调用(逐语句)
break(b)  行号
在某一行设置断点
break  函数名
在某个函数开头设置断点
info break
查看断点信息
finish
执行到当前函数返回,然后挺下来等待命令
print(p)
打印表达式的值,通过表达式可以修改变量的值或者调用函数
p 变量
打印变量值
set var
修改变量的值
continue( c)
从当前位置开始运行到下一个断点而非单步执行程序
delete breakpoints
删除所有断点
delete breakpoints n
:删除序号为 n 的断点(注意是序号不是行数)
disable breakpoints
禁用断点
enable breakpoints
启用断点
info( i) breakpoints
参看当前设置了哪些断点
display  变量名
跟踪查看一个变量,每次停下来都显示它的值
undisplay
取消对先前设置的那些变量的跟踪
until X 行号
until X 行号
breaktrace( bt)
查看各级函数调用及参数
info i) locals
查看当前栈帧局部变量的值
quit/Ctrl+d
退出 gdb

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/170221.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023-01-18 flink 11.6 时间水印 和 窗口周期的关系计算方法

forBoundedOutOfOrderness 和 TumblingEventTimeWindowsforBoundedOutOfOrderness&#xff08;M&#xff09;TumblingEventTimeWindows&#xff08;N&#xff09;第一条数据的时间TS1第一个窗口期公式&#xff1a;窗口开始时间&#xff1a;win_start ((TS1-M)/N) * N窗口结束时…

Docker上部署goweb项目

文章目录一、安装go语言环境①下载go语言环境②解压go语言环境到指定目录③验证是否成功④配置镜像加速二、go语言项目配置第一种&#xff1a;先编译后打包&#xff08;分步部署&#xff0c;靠谱&#xff09;第二种&#xff1a;直接打包法三、成功运行一、安装go语言环境 ①下…

Zabbix 监控 Linux操作系统的监控指标

一、Zabbix 监控 Linux操作系统的监控指标 (仅供参考) Zabbi x默认使用Zabbix agent监控操作系统,其内置的监控项可以满足系统大部分的指标监控,因此,在完成Zabbix agent的安装后,只需在前端页面配置并关联相应的系统监控模板就可以了。 如果内置监控项不能满足监控需求…

走向开放世界强化学习、IJCAI2022论文精选、机器人 RL 工具、强化学习招聘、《强化学习周刊》第73期...

No.73智源社区强化学习组强化学习周刊订阅《强化学习周刊》已经开启“订阅功能”&#xff0c;扫描下面二维码&#xff0c;进入主页&#xff0c;选择“关注TA”&#xff0c;我们会向您自动推送最新版的《强化学习周刊》。本期贡献者&#xff1a;&#xff08;李明&#xff0c;刘青…

【Kotlin】类的继承 ① ( 使用 open 关键字开启类的继承 | 使用 open 关键字开启方法重写 )

文章目录一、使用 open 关键字开启类的继承二、使用 open 关键字开启方法重写一、使用 open 关键字开启类的继承 Kotlin 中的类 默认都是 封闭的 , 无法被继承 , 如果要想类被继承 , 需要在定义类时 使用 open 关键字 ; 定义一个普通的 Kotlin 类 : class Person(val name: S…

分析GC日志来进行JVM调优

不同的垃圾收集器产生的GC日志大致遵循了同一个规则&#xff0c;只是有些许不同&#xff0c;不过对于G1收集器的GC日志和其他垃圾收集器有较大差别&#xff0c;话不多说&#xff0c;正式进入正文。。。 什么时候会发生垃圾收集 首先我们来看一个问题&#xff0c;那就是什么时…

SpringBoot集成Elasticsearch7.4 实战(三)

本篇文章主要讲的是:在Springboot环境下&#xff0c;管理数据1. 数据管理1.1. 新增数据1.1.1. 单实例新增http方式提交数据&#xff0c;案例中我将数据格式做了规范&#xff0c;提交过程中需要指定索引名&#xff0c;以及JSON格式数据&#xff0c;这样尽可能在实际过程中做到通…

图论算法:普里姆算法(C++实现+图解)

文章目录最小生成树普里姆算法实现过程代码实现最小生成树 什么是最小生成树? 对于如图所示的带权无向连通图来说&#xff1a;从图中任意顶点出发&#xff0c;进行dfs或者bfs便可以访问到图中的所有顶点&#xff0c;因此连通图中一次遍历所经过的边的集合以及图中所有顶点的…

libvirt零知识学习2 —— libvirt源码下载

1. libvirt官网主页 libvirt的官网地址为&#xff1a; https://libvirt.org/ 主页如下图所示&#xff1a; 2. libvirt官网下载主页 libvirt的官网下载页地址为&#xff08;在主页中点击“Download”按钮即可跳转到&#xff09;&#xff1a; https://libvirt.org/downloads…

KaiwuDB 首席解决方案专家 金宁:1.0 时序数据库核心功能解读

以下是实录文章精简版欢迎大家点赞、收藏、关注&#xff01;大家好&#xff0c;今天介绍将分为 3 部分&#xff1a;首先从物联网蓬勃发展的时代背景出发&#xff0c;我们一起来看看数据库究竟将面临怎样的挑战与机遇&#xff1b;接着我将为大家详细 KaiwuDB 1.0 时序数据库的核…

(Java高级教程)第四章必备前端基础知识-第一节:HTML

文章目录一&#xff1a;HTML概述&#xff08;1&#xff09;概述&#xff08;2&#xff09;标签&#xff08;3&#xff09;HTML基本结构二&#xff1a;常用标签介绍&#xff08;1&#xff09;注释&#xff08;2&#xff09;标题&#xff08;3&#xff09;段落&#xff08;4&…

React Fragment

首先 我们编写这样一个例子 我们在创建一个react项目 在src的目录下创建components目录 components下创建一个子组件 我这里的名字叫 subset.jsx import React from "react";export default class subset extends React.Component{constructor(props){super(prop…

阿B百大名单公布,有你喜欢的up吗?

阿B在1月13日中午19点30分公布了2022百大UP主名单&#xff0c;那么今年的某站年度UP主都是谁呢&#xff1f;你喜欢的up入选了吗&#xff1f; 咱就来自己查一下都有谁入选了吧~ 我们是用python自动获取名单的哦。 环境使用 python 3.9 pycharm 模块使用 selenium 谷歌驱动 …

Java基础之《netty(26)—netty其他常用编解码器》

一、解码器-ReplayingDecoder 1、函数声明 public abstract class ReplayingDecoder<S> extends ByteToMessageDecoder 2、ReplayingDecoder扩展了ByteToMessageDecoder类&#xff0c;使用这个类&#xff0c;我们不必调用readableBytes()方法。参数S指定了用户状态管理…

【Linux】版本管理工具 Git

目录 一、什么是 Git 二、如何使用 Git 1、创建远程仓库 2、将远端仓库克隆到本地 3、将本地文件添加到仓库 3.1、三板斧第一招&#xff1a;文件添加 3.2、三板斧第二招&#xff1a;提交本地 3.3、三板斧第三招&#xff1a;提交远端 4、删除文件 5、删除仓库 一、什么是 Gi…

postman接口关联

有两种方法&#xff0c;使用json提取器实现接口关联&#xff0c;还有使用正则表达式提取器实现接口关联。方法一&#xff1a;使用json提取器实现接口关联第一个接口&#xff1a;//使用json提取器提取contractID、documentID//把返回的字符串格式的数据转换成对象的形式var resu…

SAP FICO 理解成本中心会计

成本中心会计 一、成本要素 管理会计&#xff08;CO&#xff09;的数据均来源于FI损益类科目&#xff0c;也就是说只有损益类科目才可以创建成本要素&#xff08;必须先创建损益类科目&#xff0c;后创建成本要素&#xff09;&#xff0c; 但是不一定所有的损益类科目都需要…

gma 气象气候函数包的简要介绍及运算过程主要问题说明(内存不足、出现 nan 等)及解决方法

0 概述 0.1 明确气候与气象的概念 气候(Climate)&#xff1a;是指一个地区大气物理特征的长期平均状态&#xff0c;具有一定的稳定性&#xff0c;且周期长。根据世界气象组织&#xff08;WMO&#xff09;的规定&#xff0c;一个标准气候计算时间为 30 年。 气象(Meteorology)&…

【论文笔记】一文读懂残差网络ResNet(附代码)

Residual Net论文笔记1. 传统深度网络的问题2. 残差结构和残差网络2.1 残差是什么2.2 残差模块 Residual Block2.3 基本模块BasicBlock和BottleNeck2.4 残差网络ResNet设计2.4.1 恒等映射与残差的连接3. Forward/Backward Propagation3.1 Forward propogation3.2 Back Propogat…

深信服行为感知命令执行漏洞

深信服行为感知命令执行漏洞1.深信服行为感知漏洞1.1.漏洞描述1.2.漏洞影响1.3.漏洞复现1.3.1.登录页面1.3.2.构建漏洞URL1.3.2.1.查询IP地址1.3.2.2.查询当前目录下文件1.深信服行为感知漏洞 1.1.漏洞描述 深信服 行为感知系统c.php远程命令执行漏洞&#xff0c;使用与EDR相同…