Linux 系统下 GDB 调试器的使用
文章目录
- 简介
- GDB 的介绍
- GDB 的使用
- GDB 常用命令及示例
- 查看相关操作
- 断点相关操作
- 运行相关操作
- 变量相关操作
- 分隔窗口操作
简介
GDB 的介绍
GDB 是 GNU 调试程序,是用来调试 C 和 C++ 程序的调试器。它可以让程序开发者在程序运行时观察程序的内部结构和内存的使用情况。它是一个非图形化界面的纯命令行调试器,提供了强大的功能和灵活的选项,使得开发者能够更轻松地诊断和解决程序中的问题。
GDB 的使用非常依赖于命令行参数和选项,因此需要熟悉 GDB 的命令行语法和各种选项,GDB 调试程序通常有以下几种方式:
-
启动 GDB 时同时加载待调试程序。使用命令
gdb file_name
来启动,并同时加载待调试程序。 -
先启动 GDB,再加载、运行待调试程序。使用命令
gdb
来启动 GDB,然后使用命令load file_name
来加载待调试程序,并使用命令run
来运行程序。 -
使用 GDB 开启源码界面、界面布局设置。在 GDB 命令行界面输入命令
source file_name
可以开启源码界面,使用命令layout all
来设置界面布局。
除了以上常用的命令外,GDB 还提供了很多其他的命令和功能,可以使用命令 gdb help
或 man gdb
来查看完整的命令列表和帮助文档。
GDB 的使用
在 Linux 系统中,通常默认发布的版本为 Release 版本,这个版本的程序在编译时会被优化,以提高程序的执行效率。但是,这样做会导致程序中的调试信息被删除,使得我们无法直接使用 GDB 进行调试。
因此,如果需要使用 GDB 调试程序,就需要以 Debug 版本发布程序,要将 Release 版本的程序发布为 Debug 版本,可以使用 GCC 编译器的原文件选项 -o
指定可执行文件的名称,再使用 -g
参数来加入调试信息。其中,参数 -g
的作用是在生成的可执行文件中加入 调试信息 ,这样就可以使用 GDB 进行调试了。
举个例子,如果我们有一个 Release 版本名为 gdb_test.c
的程序,想要将它发布为 Debug 版本,可以使用以下命令。
gcc -g gdb_test.c -o test
显然,Release 版本比 Debug 版本多占一些空间,即调试信息所占的空间,如下图所示。
然后,使用命令 gdb test
启动 GDB 对 test 程序进行调试。
GDB 常用命令及示例
假设 test.c
文件是一个通过递归调用来计算 3 的阶乘的程序,该程序的具体代码如下所示。
#include <stdio.h>int cal(int n)
{if (n == 1) {return 1;} else {return n * cal(n - 1);}
}int main()
{int n = 3;int s;s = cal(n);printf("%d! = %d\n", n, s);return 0;
}
在 Linux 系统终端下执行命令 gcc -g test.c -o test
对其进行编译,其中,参数 g
的作用是把调试信息加入生成的 test 可执行文件中,否则 GDB 就无法对 test 进行调试。
接下来,使用命令 gdb test
启动 GDB 对 test 进行调试了,如下图所示。
可以看到,GDB 首先显示了版本信息和库信息,随后 GDB 停留在符号 (gdb)
处等待用户输入调试命令。GDB 提供了大量的命令来实现各种调试功能,下面仅对一些常用的命令进行介绍。
查看相关操作
在调试程序时,GCC 会给出产生警告或错误的代码行数,但在普通的文本环境中是无法直接获得语句的行数。
(1) list/l
:在 GDB 中,可以通过命令 l
( list
的缩写)可以查看程序代码,如下图所示。
(2) list/l 行号
:从某行开始显示源代码,不加行号默认从第一行开始显示,连续 l
接着上次的位置往下列(可以直接回车默认输入上次的指令),每次列 10 行,如下图所示。
(3) list/l 函数名
:表示列出某个函数的源代码,即从某个函数开始显示 10 行代码,也可以继续向下显示,如下图所示。
(4)info/i locals
:查看当前堆栈页的所有变量,如下图所示。
可以看出,该命令可以显示出该堆栈的所有变量的值。
(5)where/backtrace/bt
:显示当前调用的堆栈列表信息,如下图所示。
断点相关操作
在 GDB 中,断点是调试程序的重要方法。通过在程序的关键位置设置断点,可以让程序在执行到这些位置时停下来,从而让我们可以观察程序每一步的执行状况(例如,当前变量的值、函数是否调用、堆栈使用情况等)。
在 GDB 中,可以使用命令 b
( breakpoints
的缩写)来设置断点,通过命令 info/i beark/b
查看断点的情况及位置信息。
(1)break/b 行号
:在某一行设置断点,设置断点后,通过命令 i b
查看各个断点情况,如下图所示。
(2)break/b 函数名
:在某个函数开头设置断点,设置后断点的行数为函数的第一行代码,如下图所示。
可以看到,命令 break/b
在程序的指定位置处设置了断点,并显示了该断点在内存中的物理地址。
(3) delete/d 断点号 n
:删除序号为 n 的断点,如下图所示。
(4) delete breakpoints/d
:删除所有的断点,如下图所示。
(5) disable 序号 n
:禁用序号为 n 的断点,如下图所示。
注意:断点在禁用后,断点会继续保留,但是在运行时并不会在该断点处停止。
(6) disable breakpoints/b
:禁用所有的断点,如下图所示。
(7) enable 断点号 n
:启用序号为 n 的断点,如下图所示。
(8) enable breakpoints/b
:启用所有的断点,如下图所示。
运行相关操作
(1) run/r
:在 GDB 中,通过命令 r
( run
的缩写)运行程序,如下图所示。
可以看出,GDB 默认从代码的首行开始运行(也可以通过 r 行数
的方式让程序从指定行数开始运行),如果程序中有断点,则程序会在断点行数的前一行暂停运行。
(2) continue/c
:从当前位置开始连续执行程序,遇到断点会停止运行,如下图所示。
(3) next/n
:不进入函数,逐过程执行。在执行时会显示当前执行的语句和返回值,如下图所示。
(4) step/s
:进入函数,逐语句执行。在执行时会显示当前执行的语句和返回值,如下图所示。
(5) finish
:运行程序直到当前函数完成返回,并打印函数返回时的堆栈地址、返回值和参数值等信息,如下图所示。
变量相关操作
(1) print/p 变量名
:查看当前变量的值,如下图所示。
可以看出,GDB 通过 $N
($1
、$2
)来显示变量的值,这样在下次查看变量值时,就可以用 $N
代替变量名了。
(2)set var 变量名 = value
:修改变量的值,如下图所示。
(3)display 变量名
:跟踪查看一个变量,每次停下来都显示它的值,跟踪显示变量时是有序号的,如下图所示。
分隔窗口操作
分隔窗口方便一边查看代码,一边进行测试。
(1)layout src
:显示代码窗口,效果如下图所示。
(2)layout asm
:显示反汇编窗口,效果如下图所示。
(3)layout regs
:显示源代码/反汇编和 CPU 寄存器窗口,效果如下图所示。
(4)layout split
:显示源代码和反汇编窗口,效果如下图所示。
-
参考链接: GDB 官网
-
参考书籍:《高质量嵌入式 Linux C编程(梁庚 著)
相关文章:
Linux 系统下 GDB 调试器的使用
文章目录 简介GDB 的介绍GDB 的使用 GDB 常用命令及示例查看相关操作断点相关操作运行相关操作变量相关操作分隔窗口操作 简介 GDB 的介绍 GDB 是 GNU 调试程序,是用来调试 C 和 C 程序的调试器。它可以让程序开发者在程序运行时观察程序的内部结构和内存的使用情况…...
个人首次使用UniAPP使用注意事项以及踩坑
个人首次使用UniAPP 使用注意事项以及踩坑 自我记录 持续更新 1.vscode 插件 uni-create-view 快速nui-app页面的 uni-helper uni-app代码提示的 uniapp小程序扩展 鼠标悬停查文档 Error Lens 行内提示报错 "types": ["dcloudio/types", "mini…...
VSCode 如何解决 scanf 的输入问题——Code is already running!
文章如何使用 VSCode 软件运行C代码中已经介绍了如何在 VSCode 软件中运行C代码,但最近在使用 scanf 想从键盘输入时,运行代码后显示“Code is already running!”,如下图所示,在输出窗口是无法通过键盘输入的。 解决办法如下&am…...
短视频seo源码矩阵系统开源---代码php分享
前言:短视频seo源码 短视频seo矩阵系统源码私有化部署 短视频seo源码 短视频seo矩阵系统源码私有化怎么部署? 首先我们来给大家普及一下什么是短视频seo矩阵系统?视频矩阵分为多平台矩阵与一个平台多账号矩阵,加上seo排名优化&…...
【docker】中文无法显示输入等问题解决方法
every blog every motto: You can do more than you think. csdn: https://blog.csdn.net/weixin_39190382?typeblog ID: 胡侃有料 0. 前言 docker 路径中文不显示,无法输入中文问题解决方法 1. 解决方法 1.1 临时解决 打开etc/profile文件,末尾添…...
leetcode 1035. 不相交的线
2023.8.25 本题可以转化为:求两数组的最长公共子序列。 进而可以用dp算法解决。 方法类似于这题最长公共子序列 。 代码如下: class Solution { public:int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {vector<…...
Hystrix: 服务降级
cloud是基础,eureka是服务注册和发现,consumer是消费者去消费provider里的东西,消费方式就是Feign和Ribbon,feign 接口消费,ribbon Rest消费 服务降级发生在客户端,客户端因为请求关闭的服务器࿰…...
高精度运算(加减乘除乘法)
所谓高精度,就是大数的运算,这个大数可能是要远远超过现有数据类型的最大范围。如果我们想进行这样的运算,就要掌握计算的原理——竖式运算。 加法 我们这里先简单考虑非负数的加法,竖式这么列对吧: ①存储 我们如何…...
Mysql数据库技术知识整理
Mysql的知识点目录 重点:架构,引擎,索引,锁机制,事务机制,日志机制,集群,调优 3、Mysql索引 索引概念 覆盖索引: 条件列和结果列都在索引中索引下推: 查询会先过滤条件列,然后回表查数据最左前缀匹配&am…...
SpringBoot整合Mybatis 简单试用
1. 导入依赖 我使用MySQL,需要导入MySQL的驱动依赖此外要在SpringBoot中使用Mybatis,则需要导入Mybatis启动器 <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifact…...
SpringBoot案例-配置文件-yml配置文件
配置格式 SpringBoot提供了多种属性配置方式 application.propertiesapplication.ymlapplication.yaml常见配置文件格式对比 XML(臃肿) <configuration><database><host>localhost</host><port>3306</port><use…...
Web Components
Web Components标准非常重要的一个特性是,它使开发者能够将HTML页面的功能封装为custom elements(自定义标签),可以使用CustomElementRegistry来管理自定义标签 <script>//1、创建自定义标签class NewElement extends HTML…...
IT运维软件的费用是多少?
正常一套IT运维软件费用一般在5千-50万之间不等,而且分为一次性付费或年付费模式,付费方式导致的价格也不同。 正常情况下IT运维软件的具体价格,是需要根据企业的实际需求来进行综合评估,一般来说,影响具体价格费用有以…...
基于Three.js的WebXR渲染入门
1、Three.js 渲染管线快速概览 我不会花太多时间讨论 Three.JS 渲染管道的工作原理,因为它在互联网上有详细记录(例如,此链接)。 我将在下图中列出基础知识,以便更容易理解各个部分的去向。 2、WebXR 设备 API 入门 在我们深入了解 WebXR API 本身之前,您应该知道 WebX…...
resource doesn‘t have a corresponding Go package.
resource doesnt have a corresponding Go package. GO这个鬼东西不能直接放src下。 ************ Building Go project: ProjectGoTest ************with GOPATH: D:\Go;D:\eclipse-jee-oxygen-2-win32-x86_64\workspace\ProjectGoTest >> Running: D:\Go\bin\go.exe …...
【微服务】微服务调用原理及服务治理
本文通过图文结合,简要讲述微服务的调用原理,以及服务治理的相关概念。 1.微服务的调用原理 举个栗子:你去会所洗脚。首先,技师肯定要先去会所应聘,通过之后,会所会记录该技师的信息和技能,然后…...
【在Windows下搭建Tomcat HTTP服务】
文章目录 前言1.本地Tomcat网页搭建1.1 Tomcat安装1.2 配置环境变量1.3 环境配置1.4 Tomcat运行测试1.5 Cpolar安装和注册 2.本地网页发布2.1.Cpolar云端设置2.2 Cpolar本地设置 3.公网访问测试4.结语 前言 Tomcat作为一个轻量级的服务器,不仅名字很有趣࿰…...
前端Vue3框架知识点大全
Vue.js是一种流行的JavaScript前端框架,它的第三个版本Vue3带来了许多令人兴奋的新特性和改进。 1、响应式数据: Vue 3采用了基于Proxy的响应式系统,相比Vue 2中的Object.defineProperty,Proxy提供了更强大和灵活的拦截器&#…...
C语言练习2(巩固提升)
C语言练习2 选择题 前言 “志之所趋,无远弗届,穷山距海,不能限也。”对想做爱做的事要敢试敢为,努力从无到有、从小到大,把理想变为现实。要敢于做先锋,而不做过客、当看客,让创新成为青春远航的…...
Vulnhub: DriftingBlues: 1靶机
kali:192.168.111.111 靶机:192.168.111.215 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.215 80端口首页源码 访问noteforkingfish.txt,发现为Ook!加密的密文 解密后提示需要用户eric和修改hosts文件&…...
Android项目如何上传Gitee仓库
前言 最近Android项目比较多,我都是把Android项目上传到Gitee中去,GitHub的话我用的少,可能我还是更喜欢Gitee吧,毕竟Gitee仓库用起来更加方便 一. 创建Gitee仓库 1. 先创建一个Gitee账号,然后登录上去 2. 创建Androi…...
MySQL——基础——联合查询
联合查询 - union,union all 对于union查询,就是把多次查询的结果合并起来,形成一个新的查询结果集 SELECT 字段列表 FROM 表A ... UNION [ALL] SELECT 字段列表 FROM 表B ...; 1.将薪资低于5000的员工,和 年龄大于50的员工全部查询出来 use itcast; select * from participat…...
Vue3+Vite 初始化Cesium
Vue3Vite 初始化Cesium 安装依赖 yarn add cesium yarn add vite-plugin-cesium -D加载vite-plugin-cesium插件 import { defineConfig } from vite import vue from vitejs/plugin-vue import cesium from vite-plugin-cesium;export default defineConfig({plugins: [vue(…...
c++内存地址分配
...
改进YOLO系列:9.添加S2Attention注意力机制
添加S2Attention注意力机制 1. S2Attention注意力机制论文2. S2Attention注意力机制原理3. S2Attention注意力机制的配置3.1common.py配置3.2yolo.py配置3.3yaml文件配置1. S2Attention注意力机制论文 论文题目:S 2 -MLPV2: IMPROVED SPATIAL-SHIFT MLP ARCHITECTURE…...
微服务Feign组件远程调用自定义解码器
Feign远程调用响应结果格式 public class Result<T> {/*** 响应码,200为成功*/private Integer code;/*** 响应信息*/private String message;/*** 响应的具体对象*/private T data; }自定义Feign解码器 Component // 注入Spring的IOC容器中,所有…...
FairyGUI编辑器自定义菜单扩展插件
本文涉及到的软件有:FairyGUI,VSCode 代码环境涉及到了:Lua VSCode插件:EmmyLua 在编写FairyGUI编辑器菜单前,了解一下FairyGUIEditor的API会有效的帮助我们解决很多问题。FairyGUI的扩展是通过编辑器自带的插件功能…...
若依二次开发
目录 本地启动 前端代码 后端代码 代码适配 数据表初始化 远程部署...
安全(权限)框架Shiro概述及原理
1.1 Shiro是什么 Apache Shiro是一个功能强大且易于使用的Java安全(权限)框架。Shiro可以完成:认证、授权、加密、会话管理、与Web集成、缓存 等。借助Shiro您可以快速轻松地保护任何应用程序——从最小的移动应用程序到最大的Web和企业应用…...
java: 无法访问org.springframework.boot.SpringApplication 错误的类文件
项目场景: 提示:这里简述项目相关背景: 错误1: java: 无法访问org.springframework.boot.SpringApplication 错误的类文件: /D:/Software/env-java/apache-maven-3.6.1/repository/org/springframework/boot/spring-boot/3.1.2/sp…...
哈尔滨营销网站建设/南城网站优化公司
今天我在学习《Python编程:从入门到实践》的时候,发一下一个问题,特此在此记录一下! Geany是一款简单的文本编辑器:它易于安装;让你能够直接运行几乎所有的程序(而无需通过终端来运行ÿ…...
网站优化推广方案/全网推广平台
1.indexOf和lastIndexOf方法: 因为IE7在数组对象上使用indexOf会报错,所以需要重写一个兼容性的。 Array.prototype.lastIndexOf(item,index){ var n this.length,i (indexnull||index>n-1)?n-1:index; if(i < 0) i ni; for(;i>0;i--) if(t…...
广州做网站哪家公司好/键词优化排名
B树 B树,也叫B-树,就是B-Tree(BalanceTree),是一种多路搜索树,它在文件系统中很有用,它不是二叉树,而是m(m>3)叉树,具有以下特征: 树中每个节点至多有m个结…...
网站设计制作的四大优势/网站关键词搜索排名优化
Redis和StrictRedis Redis库提供了两个类Redis和StrictRedis用于实现Redis的命令操作。 StrictRedis实现了绝大部分官方文档的命令,参数也一一对应,比如set方法就对应Redis命令的set方法。而Redis是StrictRedis的子类,它的功能主要是用于向后…...
wordpress 4.3.1/aso安卓优化
text-decoration文本装饰 微信小程序交流群:111733917 | 微信小程序从0基础到就业的课程:https://edu.csdn.net/topic/huangjuhua 语法 接下来,我们讨论 text-decoration 属性,这是一个很有意思的属性,它提供了很多非…...
网站建设是永久使用吗/企业产品推广运营公司
您可以使用JDialog的setDefaultCloseOperation()方法,指定DISPOSE_ON_CLOSE:setDefaultCloSEOperation(JDialog.DISPOSE_ON_CLOSE);附录:结合 camickr的帮助答案,当窗口关闭或按下关闭按钮时,此示例退出.import java.awt.EventQueue;import java.awt.Gri…...