Linux 调试器 --- g d b 使用

目录


一:gdb简介

二:示例代码

三:使用

1.启动gdb

2.各种指令

<1>: 查看源代码 

<2>:设置断点

<3>:查看断点信息

<4>:删除断点

<5>: run 

<6>:逐过程调试

<7>:逐语句调试

<8>:查看变量值

<9>:跳转行号

四:总结


一:gdb简介

        GDB 全称“GNUsymbolic debugger”,是 Linux 下常用的程序调试器。发展至今,GDB 已经迭代了诸多个版本,当下的 GDB 支持调试多种编程语言编写的程序,包括 C、C++、Go 等等。实际场景中,GDB 更常用来调试 C 和 C++ 程序。一般来说,GDB主要帮助我们完成以下四个方面的功能: 启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。 在某个指定的地方或条件下暂停程序。 当程序被停住时,可以检查此时你的程序中所发生的事。 在程序执行过程中修改程序中的变量或条件,将一个bug产生的影响修正从而测试其他bug。

二:示例代码

code.c 文件内容为:

#include<stdio.h>
int ADDToTop(int num)
{int result = 0;int i = 0;for(i = 1; i <= num; i++){result += i;}return result;
}
int main()
{int num = 10;int sum = 0;sum = ADDToTop(num);printf("sum: %d\n",sum);return 0;
}

makefile 文件内容为:

mycode:code.cgcc -o $@ $^ -g
.PHONY:clean
clean:rm -f mycode

我们知道程序的发布形式,有两种,一种为 debug 模式,另一种为 release 模式。一般情况下,编译指令为: gcc code.c -o test ,要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项。不加就是默认为 release 版本。

编译为 debug 版本的指令为:

gcc code.c -o code.debug -g -std=c99

debug版本需要一些调试信息,占用的内存更大,所以我们可以通过占用内存的大小,判断Linux gcc/g++出来的二进制程序,默认是哪一种模式?

89a4768a9a4b47ffad37919f0b666b51.png

通过上述示例,我们可以看出,Linux gcc/g++出来的二进制程序,默认是release模式。

5dc4d7cde85a4bbdafdc105b16f114d6.png

-std = c99 ,c99 是C语言的一个标准,该标准规定了可以在循环控制条件里面定义变量,(eg:for(int i = 0; i < 10; i++)。如果没有使用,则可能会导致:

683e2b8658164be5ae41d1ae7f1242d9.png

三:使用

1.启动gdb

启动 gdb 的指令为 [gdb + 文件的名称] 示例:

gdb mycode

运行效果为:

b1f0998dc3da4841ba2554db0be1eccf.png

此时,需要我们切换为 root 用户,安装 gdb ,如下图所示:

b752e8df1b0f4b75bd46a7fca6edc3bd.png

此时,我们再切回普通用户,进行启动 gdb 的工作:

63122376969344bb9d0e6f02c52d6194.png

73a03a26f95e4390a61991da8581bb74.png

如果出现上述界面,则说明已经进入 gdb 调试,接下来可以开始使用各种指令进行调试。

2.各种指令

在进行各种调试指令之前,我们需要首先知道退出调试的指令:

ctrl + d 或 quit 调试命令

<1>: 查看源代码 

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

ddfeb7f86d034c048b3c90898a8e0dea.png

<2>:设置断点

break(b) 行号:在某一行设置断点

我们此处在以 #include<stdio.h> 为第一行的第16行打上断点: 

058377009557425281a31ab0e4d8954a.png

break 函数名:在某个函数开头设置断点

在 main 函数,和 ADDToTop函数开头打断点 

5438d82629ff4b1290b456ff5278515b.png

<3>:查看断点信息

info break :查看断点信息

我们查看在 <2> 第16行所打的断点:

a43a8251d0be4d5082c8bd25e28f07ec.png

Num --- 编号   Type --- 种类   Address --- 断点在内存中的位置  What --- 断点在程序中的位置

查看 <2> 中指定函数名打断点:

6fac154aa6fc4ad7a9c7418986c305c1.png

<4>:删除断点

delete breakpoints n:删除序号为n的断点
disable breakpoints:禁用断点
enable breakpoints:启用断点

n --- 表示该断点不可用,y --- 表示该断点可用

3bccfa7e94a54e888c8581542bb36e04.png 如果想把已经变为 n 的改变为 y ,则需要执行:enable b 3 命令,示例:

dffc3c929339428b9c9cdd57fedb4522.png

<5>: run 

run(或r):从开始连续而非单步执行程序
如果有断点,则执行到断点处停止,如果没有断点,则执行到结束。

c8ae98f5eef74505aa12a14c0b2a210d.png

d69fa615ed6d4b1a8bd6eb3c7e28beb3.png

<6>:逐过程调试

n 或 next:单条执行。一步步执行,但不会进入函数内部

清空原来的所有断点,在第16行打上断点,按下 r  运行键,程序会在断点处停下,此时输入 n,观察现象:

 程序直接执行完了 ADDToTop 函数内部的全部内容。

<7>:逐语句调试

s或step:进入函数调用,遇到函数时,会进入函数内调试

 保持第16行的断点,按下 r 执行到断点处停止,此时在按下 s ,观察现象:

我们发现逐语句调试过程中,进入了 ADDToTop 函数内部,并且一步一步往下执行。

<8>:查看变量值

p 变量:打印变量值。

 可以用于查看循环执行到某一步的时候,查看某个/某些变量的值,如下图所示:

<9>:跳转行号

until X行号:跳至X行

当我们进入一个函数后,可能会存在需要循环很多次的场景,此时,我们可以通过 until 行号 跳转到指定行数,示例如下:

 

四:总结


  • 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):从当前位置开始连续而非单步执行程序
  • run(或r):从开始连续而非单步执行程序
  • delete breakpoints:删除所有断点
  • delete breakpoints n:删除序号为n的断点
  • disable breakpoints:禁用断点
  • enable breakpoints:启用断点
  • info(或i) breakpoints:参看当前设置了哪些断点
  • display 变量名:跟踪查看一个变量,每次停下来都显示它的值
  • undisplay:取消对先前设置的那些变量的跟踪
  • until X行号:跳至X行
  • breaktrace(或bt):查看各级函数调用及参数
  • info(i) locals:查看当前栈帧局部变量的值
  • quit:退出gdb

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

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

相关文章

TrustZone​之在安全状态之间切换

如果处理器处于NS.EL1,而软件想要转移到S.EL1,应该如何实现呢? 要改变安全状态,无论是向上还是向下,执行都必须经过EL3,如下图所示: 前面的图表显示了在不同安全状态之间移动涉及的步骤的示例序列。逐步进行解释: 进入较高的异常级别需要一个异常。通常,此异常…

相关基础知识

本文引注&#xff1a; https://zhuanlan.zhihu.com/p/447221519 1.方差 2.自协方差矩阵 3.自相关矩阵 4.互协方差矩阵 5.互相关矩阵 6.相关系数 7.自相关函数、自协方差函数与功率谱密度 8.互相关函数、互协方差函数与互功率谱密度

时间选择器

<el-form-item label"时间范围"><!-- <el-date-picker size"small"v-model"createTime"type"daterange"range-separator"至"start-placeholder"请输入起始创建时间"end-placeholder"请输入终止创…

无线网优AP、SW发现控制器

目录 无线网优解决的问题 1、信号覆盖不足的原因 2、信道繁忙 3、非802.11干扰 4、协商速率低 5、漫游效果差 6、有线带宽阻塞 无线网优方法 交换机发现与激活 一&#xff0c;交换机发现控制器方式 1、二层广播 2、DHCP option43方式 3、DNS域名解析方式 4、trou…

基于springboot + vue大学生竞赛管理系统

qq&#xff08;2829419543&#xff09;获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;springboot 前端&#xff1a;采用vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xf…

【AIGC】AI作图最全提示词prompt集合(收藏级)

目录 一、正向和负向提示词 二、作图参数 你好&#xff0c;我是giszz. AI做图真是太爽了&#xff0c;解放生产力&#xff0c;发展生产力。 但是&#xff0c;你是不是也总疑惑&#xff0c;为什么别人的图&#xff0c;表现力那么丰富呢&#xff0c;而且指哪打哪&#xff0c;要…

DFT(离散傅里叶变换)的通俗理解

本文包含了博主对离散傅里叶变换&#xff0c;负频率&#xff0c;实信号与复信号频谱的理解&#xff0c;如有不妥&#xff0c;欢迎各位批评指正与讨论。 文章目录 DFT的理解信号的频谱实信号的频谱复信号的频谱 DFT的理解 傅里叶变换是一种将信号从时域转换到频域的数学工具。…

通信标准化协会,信通院及量子信息网络产业联盟调研玻色量子,共绘实用化量子未来!

8月14日&#xff0c;中国通信标准化协会&#xff0c;信通院标准所及量子信息网络产业联盟等单位领导走访调研北京玻色量子科技有限公司&#xff08;以下简称“玻色量子”&#xff09;&#xff0c;参观了玻色量子公司及自建的十万颗粒洁净度的光量子信息技术实验室&#x1f517;…

STM32下载程序的五种方法

刚开始学习 STM32 的时候&#xff0c;很多小伙伴满怀热情买好了各种设备&#xff0c;但很快就遇到了第一个拦路虎——如何将写好的代码烧进去这个黑乎乎的芯片&#xff5e; STM32 的烧录方式多样且灵活&#xff0c;可以根据实际需求选择适合的方式来将程序烧录到芯片中。本文将…

10年前,我就用 SQL注入方式发现了学校网站的漏洞

大家好&#xff0c;我是风筝。 事情是这样子的&#xff0c;在10年以前&#xff0c;某个月黑风高夜的夜里&#xff0c;虽然这么说有点暴露年龄了&#xff0c;但无所谓&#xff0c;毕竟我也才18而已。我打开电脑&#xff0c;在浏览器中输入我们高中学校的网址&#xff0c;页面很…

TCP首部格式_基本知识

TCP首部格式 表格索引: 源端口目的端口 序号 确认号 数据偏移保留 ACK等 窗口检验和紧急指针 TCP报文段首部格式图 源端口与目的端口: 各占16位 序号:占32比特&#xff0c;取值范围0~232-1。当序号增加到最后一个时&#xff0c;下一个序号又回到0。用来指出本TCP报文段数据载…

ctfhub技能树_web_信息泄露

目录 二、信息泄露 2.1、目录遍历 2.2、Phpinfo 2.3、备份文件下载 2.3.1、网站源码 2.3.2、bak文件 2.3.3、vim缓存 2.3.4、.DS_Store 2.4、Git泄露 2.4.1、log 2.4.2、stash 2.4.3、index 2.5、SVN泄露 2.6、HG泄露 二、信息泄露 2.1、目录遍历 注&#xff1…

【ArcGIS Pro微课1000例】0050:如何清除坐标系信息

文章目录 一、目的二、方法1. 使用【定义投影】工具2. 清除数据的投影信息3. 删除坐标文件 一、目的 地理信息数据的坐标系是将地理信息数据进行融合、叠加、分析的重要数学框架&#xff0c;而其描述信息是非常重要的元数据&#xff0c;涉及整个国家的测绘坐标系统&#xff0c…

DSSS技术和OFDM技术

本内容为学习笔记&#xff0c;内容不一定正确&#xff0c;请多处参考进行理解 https://zhuanlan.zhihu.com/p/636853588 https://baike.baidu.com/item/OFDM/5790826?frge_ala https://zhuanlan.zhihu.com/p/515701960?utm_id0 一、 DSSS技术 信号替代&#xff1a;DSSS技术为…

C++ 操作MinIO做文件数据的上传和下载(踩坑与经验)包含编译包

前言 最近在做项目流程优化&#xff0c;准备将之前的java对文件的操作转换到c端&#xff0c;因此做了基于c的minio操作的测试demo。期间的各种踩坑与问题&#xff0c;花了一天时间总算是成功了&#xff0c;当然还有一些小问题&#xff0c;等待后续其他大拿解决。 项目环境 v…

Jmeter调用本地Exe程序

背景&#xff1a; 候使用C#编译的小工具制作压测的请求的入参&#xff0c;因Jmeter无法调用C#的方法&#xff0c;可以把C#编译个exe程序&#xff0c;在启动压测前&#xff0c;让JMeter调用本地的exe批量生成压测数据。 使用步骤&#xff1a; 打开Jmeter&#xff0c;右击选择…

【Vue】使用cmd命令创建vue项目

上一篇&#xff1a; node的安装与配置 https://blog.csdn.net/m0_67930426/article/details/134562278?spm1001.2014.3001.5502 目录 一.创建空文件夹专门存放vue项目 二. 查看node , npm 和vue脚手架的版本 三.安装vue脚手架 四.创建vue项目 五.运行项目 一.创建空文件…

第五期丨酷雷曼无人机技能培训圆满举办

第5期无人机技能提升培训 2023年11月28日-29日&#xff0c;为期2天的酷雷曼第五期无人机技能提升培训会圆满举办。本届培训会盛况依旧&#xff0c;数十位合作商不远千里相约&#xff0c;共同提升专业水准&#xff0c;考取执照证书。 入场签到 初冬已至&#xff0c;尽管天气渐…

properties出现中文乱码解决方法(万能)

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 在使用Properties类的时候,中文出现乱码 如图所示: 正常思维来讲,估计是中文编码有问题,于是我将其改为UTF-8的编码方式 通过下方的改动: 可到了这一步,中文还是乱码(这一步改成功的网友可自动立场,没改成功的网…

PVE系列-LVM安装MacOS的各个版本及VNC加密隧道访问

PVE系列-LVM安装MacOS的各个版本 环境配置大概过程&#xff1a;详细步骤&#xff1a;1.建立安装环境和下载安装工具2. 重启后&#xff0c;执行osx-setup配置虚拟机3. 安装到硬盘&#xff0c;4.设定引导盘&#xff0c;以方便自动开机启动5.打开屏幕共享和系统VNC6.VNC加密的ssh隧…