当前位置: 首页 > news >正文

Linux友人帐之调试器--gdb的使用

一、debug和realease版本的区别

区别

debug是给程序员用的版本,添加了调试信息,用于解决软件或程序中出现的问题,realease是发行给客户使用的版本,并未添加调试信息,只需要给客户提供优越的产品使用环境即可,至于是否能够debug调试,这是程序员才应该关心的主要问题。

可以看到debug版本的字节大小是要大于realease版本的,这是因为其中添加了调试信息。

通过指令可以读取可执行程序的二进制构成,显示出具体的二进制软件的内部所形成的特定格式。
值得注意的是:每一个二进制程序不仅仅只是一堆二进制代码,他们内部都是有特定格式的,Linux中形成的可执行程序是elf格式。

 readelf命令

 readelf命令是一个可以读取ELF(Executable and Linkable Format)文件头部信息的Linux命令。ELF文件是一种可执行文件和共享库的标准格式,包含了代码段、数据段、符号表和动态链接信息等。通过readelf命令,用户可以查看这些信息,如ELF文件的类型、入口地址、节区信息、符号表、重定位信息、动态链接信息等。

常用的readelf命令选项包括:

  • -a或--all:显示所有信息,默认选项;
  • -h或--file-header:显示文件头(包括ELF文件类型、入口地址等);
  • -S或--sections:显示节区信息;
  • -s或--symbols:显示符号表信息;
  • -r或--relocs:显示重定位信息;
  • -d或--dynamic:显示动态链接信息。

下面就是debug中所添加的调试信息,而realease版本是没有这些调试信息的 

 

 

 二、 调试器gdb

3.1gdb介绍

gdb是GNU开源组织发布的一个用于Unix/Linux的程序调试工具。

与其它调试器一样,gdb可以在程序中设置断点、查看变量值,跟踪程序执行的过程。

利用调试器的这些功能可以方便地找出程序中存在的非语法错误。

3.2环境配置

安装

编写一个用于测试的程序test.c 

#include <stdio.h>int get_sum(int n)
{int sum = 0, i;for (i = 1; i <= n; i++)sum += i;return sum;
}int main()
{int j = 100, res;res = get_sum(j);printf("1+2+...+%d = %d\n", j, res);return 0;
}

编译并运行该程序

gcc -g test.c -o test

需要-g参数

./test

几点注意:

  • 默认情况下,gdb无法进行对gcc现在发布的程序进行调试,因为gcc默认生成的软件是realease版本的,没有调试信息,无法被调试器gdb调试,并且gcc是默认动态链接的,如果想静态链接还需要加static选项,所有gcc是有两种默认行为的。
  • gcc编译时添加-g选项可以使得gcc发布的程序软件为debug版本,这样就可以通过gdb对程序进行调试

3.3gdb的启动和退出

启动:

1. gdb [程序名]

gdb test

2. gdb --quiet

(gdb)file test

退出

(gdb)quit

3.4gdb常用命令

help命令

 其他命令

显示程序源代码list

list: 输出从上次调用list命令开始向后的10行程序代码

list -: 输出从上次调用list命令处向前10行代码

list n: 输出n行附近的10行代码

list [函数名]: 输出函数附近的10行代码

list n1,n2: 显示第n1行到n2行的代码  

搜索字符串

forward/search [字符串]: 从当前位置向后查找指定的字符串所在的程序行,查找时不包括当前行,可以用list n,n将当前行设置为n

reverse-search [字符串]: 从当前行向前查找第一个匹配的字符串

执行程序

在shell环境下使用gdb test,或在gdb环境下使用file test只是载入了程序,但是程序是没有运行的

运行:

(gdb)run

3.5断点的设置和管理

设置断点

1 以行数设置断点

格式: break n

功能: 当程序运行到指定行时,会暂停执行,指定行的代码不执行

例如:

(gdb)break 15

(gdb)run

2 以函数设置断点

格式: break [函数名]

例如:

(gdb)break get_sum

(gdb)run

3 以条件表达式设置断点

格式: break [行号或函数名] if [条件]

功能: 程序在运行过程中,满足设定条件时,程序在所设置处中断

例如:

(gdb)break 7 if i==99

含义: 当程序执行到第7行时,判断条件i==99是否成立,若成立则中断

4 以条件表达式变化设置断点

格式: watch [条件表达式]

功能: 程序在运行过程中,当满足设定条件时,程序中断

注意:watch必须在程序运行的过程中设置观察点,即运行run之后,并且要保证条件表达式中的变量已经使用过。

例1

(gdb)break 13

(gdb)run

(gdb)watch sum==3

例2

(gdb)break 5

(gdb)run

(gdb)watch sum==3

查看断点

查看当前设置的断点

格式: info breakpoints( info b

例如:

(gdb)break 7

(gdb)break 15 if res==5050

(gdb)info breakpoints

管理断点

1. 使中断失效或有效

失效: disable [断点编号]

有效: enable [断点编号]

2. 删除断点

clear [行号]: 删除此行的断点

delete [断点编号]: 删除指定编号的断点, 若有一次删除多个断点,各断点编号以空格分开。

delete: 删除程序中所有的断点

3. 取消断点  d + 断点编号

查看和设置变量的值

当程序执行到中断点暂停时,往往需要查看变量或表达式的值,借此了解程序的执行状态,进而发现问题。

1 print

功能: 打印变量或表达式的值,还可以用来对某个变量进行赋值。

print [变量或表达式]: 打印变量或表达式的值

print [变量]=[值]: 对变量进行赋值 

例如:

(gdb)break 7

(gdb)run

(gdb)print i < n

(gdb)print i

(gdb)print sum

(gdb)print i=200

(gdb)continue

2 whatis

功能: 用于显示某个变量或表达式的数据类型

格式: whatis [变量或表达式]

例如:

(gdb)break 7

(gdb)run

(gdb)whatis i

(gdb)whatis sum

(gdb)whatis sum+0.5

3 set

功能: 给变量赋值

格式: set variable [变量]=[值]

4.临时查看变量或地址的值:p + 变量或地址

控制程序的执行

当程序执行到指定的中断点时,完成相关的debug操作后,可以让程序继续运行

1 continue

程序继续运行,直到下一个断点或运行完毕(运行至下一个断点处:c(continue))

2 kill

结束当前程序的调试

3 next/step

功能: 一次一条执行程序代码(逐过程:n(next),逐过程:n(next)

区别: next把函数调用当做一条语句来执行;step追踪进入函数,一次一条地执行内部代码。

4.跳转到指定行:until+行号

可以利用until来跳出循环

 

相关文章:

Linux友人帐之调试器--gdb的使用

一、debug和realease版本的区别 区别 debug是给程序员用的版本&#xff0c;添加了调试信息&#xff0c;用于解决软件或程序中出现的问题&#xff0c;realease是发行给客户使用的版本&#xff0c;并未添加调试信息&#xff0c;只需要给客户提供优越的产品使用环境即可&#xff…...

antd pro form 数组套数组 form数组动态赋值 shouldUpdate 使用

antd form中数组套数组 form数组动态变化 动态赋值 需求如上&#xff0c;同时添加多个产品&#xff0c;同时每个产品可以增加多台设备&#xff0c;根据设备增加相应编号&#xff0c;所以存在数组套数组&#xff0c;根据数组值动态变化 使用的知识点 form.list form中的数组…...

动态规划:918. 环形子数组的最大和

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《算法》 文章目录 前言一、题目解析二、解题思路解题思路状态表示状态转移方程初始化填表顺序返回值 三、代码实现总结 前言 本篇文章仅是作为小白的我的一些理解&#xff0c;&#xff0c;…...

毅速丨模具3D打印材料有哪些选择

当前1.2709和CX是市面上最常用的3D打印模具钢材料&#xff0c;模具3D打印有没有更多的材料选择呢&#xff1f; 据了解&#xff0c;上海毅速推出的几款3D打印新材料正在被越来越多的行业所采用。如毅速的EM191S高性能高抛光不锈钢粉末&#xff0c;这款材料的抗开裂和耐腐蚀性能是…...

Springcloud笔记(1)-微服务和springcloud介绍

微服务简介 就是将一个大的应用&#xff0c;拆分成多个小的模块&#xff0c;每个模块都有自己的功能和职责&#xff0c;每个模块可以 进行交互&#xff0c;这就是微服务对于微服务&#xff0c;业界没有严格统一的定义&#xff0c;但是作为“微服务”这名词的发明人&#xff0c;…...

十六、代码校验(4)

本章概要 调试 使用 JDB 调试图形化调试器 调试 尽管聪明地使用 System.out 或日志信息能给我们带来对程序行为的有效见解&#xff0c;但对于困难问题来说&#xff0c;这种方式就显得笨拙且耗时了。 你也可能需要更加深入地理解程序&#xff0c;仅依靠打印日志做不到。此时…...

【已解决】No Python at ‘D:\Python\python.exe‘

起因&#xff0c;我把我的python解释器&#xff0c;重新移了个位置&#xff0c;导致我在Pycharm中的爬虫项目启动&#xff0c;结果出现这个问题。 然后&#xff0c;从网上查到了这篇博客: 【已解决】No Python at ‘D:\Python\python.exe‘-CSDN博客 但是&#xff0c;按照上述…...

蓝桥杯双周赛算法心得——数树数(dfs)

大家好&#xff0c;我是晴天学长&#xff0c;一个简单的dfs思想&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。 1) .数树数 2) .算法思路 代码的主要逻辑是&#xff1a; 1.使用Scanner读取输入的整数n和q&#xff0c;其中n表示测试用例的数量&am…...

综述:大规模小目标检测

论文地址: Towards Large-Scale Small Object Detection: Survey and Benchmarks​arxiv.org/abs/2207.14096 目录 摘要 1.Introduction 1.1 与之前综述的比较 1.2 总结 2.小目标检测回顾 2.1 问题定义 2.2 主要挑战 2.3 小目标检测算法回顾 3.小目标检测的数据集 …...

ORACLE XXX序列 goes below MINVALUE 无法实例化的处理办法

--序列增加区分 --删除未使用序列表 DECLARE V_CNT INT; BEGINSELECT COUNT(*) INTO V_CNT FROM USER_SEQUENCES WHERE SEQUENCE_NAME SEQ_INTELLECT_BIZ_DETAIL_ID;IF V_CNT1 THEN BEGINEXECUTE IMMEDIATE DROP SEQUENCE SEQ_INTELLECT_BIZ_DETAIL_ID;END;END IF; END; / ---…...

6款流程图制作软件:一站式指南

流程图是一种常用的图示工具&#xff0c;可以帮助我们更清晰地表达和展示流程、流程图等内容。在今天已经变得非常普及和便捷&#xff0c;接下来本文将于大家分享6款好用的流程图软件&#xff0c;一起来看看吧&#xff01; 博思白板boardmix 博思白板boardmix是一款基于浏览器…...

第三章:Python中的序列(上)

Python中的序列 是一种有序的数据结构,通常用于存储一组相关的元素。Python中的序列包括列表(list)、元组(tuple)和字符串(string)。 1. 列表 是最常用的序列类型,它是可变的(即可以添加、删除和修改元素)。列表中的元素可以是任何类型,包括其他列表或元组。列表…...

使用.NET实现WOL唤醒远程开机

文章目录 1. 背景2. 关于 WOL2.1 WOL 工作原理2.2 开启网卡唤醒功能 3. 快速验证3.1 局域网 Wake on Lan 应用3.2 Ubuntu 的 etherwake 命令4. 代码实现4.1 创建.NET控制台应用程序4.2 编写代码4.3 运行应用程序 5. 最后 1. 背景 家居自动化是现代智能家居的重要组成部分&…...

适用于 Golang 的任务调度程序 AGScheduler

以前一直使用 Python 的任务调度库 APScheduler&#xff08;支持任务持久化&#xff0c;支持多种存储方式&#xff09;&#xff0c;但由于没有找到和它功能和使用方式类似的 Golang 库&#xff0c;所以模仿 APScheduler 3.x 写了个简易版本的 AGScheduler。 AGScheduler Advan…...

【HCIP】HCIA复习

目录 大纲 情景代入 访问百度/谷歌服务器的准备工作 1、计算机网络发展第一阶段人机交互的加工过程 2、OSI参考模型 3、TCP/IP参考模型 访问谷歌&#xff08;百度&#xff09;服务器的流程 1、主机需要一个IP地址才能上网&#xff08;本场景中通过DHCP服务获取IP地址&a…...

【Python小项目之Tkinter应用】【实用工具】实现手写签名器,可选线条粗细,支持清空、撤销、恢复功能,可将写好的签名保存成图片

文章目录 前言一、实现思路二、关键代码三、完整代码总结同系列项目文章:前言 老规矩,先看效果: 在手写签名窗口中,用户可以选择线条粗细来签名,点击清空按钮可以清空画布,点击撤销按钮可以撤销一笔,点击恢复按钮可以撤销上一步进行的清空或撤销操作,点击保存按钮可以…...

Jenkins集成newman

一、Docker环境准备 二、Jenkins环境准备 三、登录Jenkins 安装NodeJs插件 四、Jenkins全局工具配置Nodejs 五、创建Jenkins自由风格项目 构建步骤1&#xff1a;选择Execute NodeJS script构建步骤2&#xff1a;选择执行shell脚本 六、将postman相关的脚本、环境变量数据、全局…...

Excel——对其他工作表和工作簿的引用

一、引用其他sheet页表区域 若希望在公式中引用其他工作表的单元格区域&#xff0c;可以在公式编辑状态下&#xff0c;通过鼠标单击相应的工作表标签&#xff0c;然后选择相应的单元格区域。 例1 跨sheet页引用其他工作表区域 如图1所示的工作表Sheet2为工资表。 在Sheet1表…...

如何正确的防止服务器被攻击?103.216.153.x

网站服务器被攻击是新建网站常常发生的事情&#xff0c;对于新手来说这也是非常棘手的问题。那么一旦遇到这样的情况&#xff0c;我们需要如何解决呢&#xff1f;怎么才能防止服务器被攻击&#xff0c;怎么保障自己网站信息的安全&#xff0c;如果发现被攻击又该怎么做呢&#…...

本地生活将成快手新的营收增长点

监制 | 何玺 排版 | 叶媛 快手本地生活开始强化B端市场。 据了解&#xff0c;快手 “本地商家”APP已经正式上线。这是快手为本地生活商家推出的独立工作平台&#xff0c;有助于商家提升经营效率。 新APP的上线&#xff0c;标志着快手本地生活业务布局&#xff0c;正从过去侧…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

ArcPy扩展模块的使用(3)

管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如&#xff0c;可以更新、修复或替换图层数据源&#xff0c;修改图层的符号系统&#xff0c;甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...

用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章

用 Rust 重写 Linux 内核模块实战&#xff1a;迈向安全内核的新篇章 ​​摘要&#xff1a;​​ 操作系统内核的安全性、稳定性至关重要。传统 Linux 内核模块开发长期依赖于 C 语言&#xff0c;受限于 C 语言本身的内存安全和并发安全问题&#xff0c;开发复杂模块极易引入难以…...

轻量级Docker管理工具Docker Switchboard

简介 什么是 Docker Switchboard &#xff1f; Docker Switchboard 是一个轻量级的 Web 应用程序&#xff0c;用于管理 Docker 容器。它提供了一个干净、用户友好的界面来启动、停止和监控主机上运行的容器&#xff0c;使其成为本地开发、家庭实验室或小型服务器设置的理想选择…...

Java中HashMap底层原理深度解析:从数据结构到红黑树优化

一、HashMap概述与核心特性 HashMap作为Java集合框架中最常用的数据结构之一&#xff0c;是基于哈希表的Map接口非同步实现。它允许使用null键和null值&#xff08;但只能有一个null键&#xff09;&#xff0c;并且不保证映射顺序的恒久不变。与Hashtable相比&#xff0c;Hash…...

在Spring Boot中集成RabbitMQ的完整指南

前言 在现代微服务架构中&#xff0c;消息队列&#xff08;Message Queue&#xff09;是实现异步通信、解耦系统组件的重要工具。RabbitMQ 是一个流行的消息中间件&#xff0c;支持多种消息协议&#xff0c;具有高可靠性和可扩展性。 本博客将详细介绍如何在 Spring Boot 项目…...

【AI News | 20250609】每日AI进展

AI Repos 1、OpenHands-Versa OpenHands-Versa 是一个通用型 AI 智能体&#xff0c;通过结合代码编辑与执行、网络搜索、多模态网络浏览和文件访问等通用工具&#xff0c;在软件工程、网络导航和工作流自动化等多个领域展现出卓越性能。它在 SWE-Bench Multimodal、GAIA 和 Th…...

关于 ffmpeg设置摄像头报错“Could not set video options” 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/148515355 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…...