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来跳出循环

 

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

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

相关文章

数据库系统概论学习 1 绪论

1.1.1 数据、数据库、数据库管理系统、数据库系统 一、数据 Data 数据是数据库中存储的基本对象 定义&#xff1a;描述事物的符号记录称为数据&#xff0c;描述事物的符号可以是数字、文字、图像、图形、声音、语言等表现形式&#xff0c;它们都可以经过数字化后存入计算机。…

【C++进阶】:C++类型转换

C类型转换 一.C语言里的类型转换二.C语音类型转换的一些弊端三.C的四种类型转换1.static_cast2.reinterpret_cast3.const_cast4.dynamic_cast 一.C语言里的类型转换 在C语言中&#xff0c;如果赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不匹配&#xff0c;或者…

ST‐LINK V2 使用说明(安装,调试,烧录)

目录 1. 初识 ST-LINK V2 1.1 ST-LINK V2 简介 2. ST-LINK V2 驱动的安装与固件升级 2.1 驱动的安装 2.2 固件的升级 3. 使用 STM32 ST-LINK Utility 烧写目标板 hex 3.1 ST-LINK 烧写 hex 文件 4.使用 ST-LINK V2 调试 STM8 4.1 ST‐LINK 调试 STM8 5.…

String方法:分割、梦回C语言,格式化输出format

String poem "锄禾日当午&#xff0c;汗滴禾下土&#xff0c;谁知盘中餐&#xff0c;粒粒皆辛苦";String[] split poem.split("&#xff0c;");System.out.println("悯农");for (int i 0; i < split.length; i) {System.out.println(split…

53 打家劫舍

打家劫舍 题解1 DP1题解2 DP2 &#xff01;经典DP&#xff01; 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果 两间相邻的房屋在同一晚上被小偷闯入…

【C++】继承 -- 详解

一、继承的概念及定义 1、继承的概念 继承 (inheritance) 机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保 持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。 继承呈现了面向对象 程序设…

【Vue】vue2与netcore webapi跨越问题解决

系列文章 C#底层库–记录日志帮助类 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/124187709 文章目录 系列文章前言一、技术介绍二、问题描述三、问题解决3.1 方法一&#xff1a;前端Vue修改3.2 方法二&#xff1a;后端允许Cors跨越访问 四、资源…

前端TypeScript学习day04-交叉类型与泛型

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 交叉类型 泛型 创建泛型函数 调用泛型函数&#xff1a; 简化调用泛型函数&#xff1a; 泛型约束 指定…

浅谈MDK, IAR,CLANG和GCC的局部变量字节对齐处理差异(2023-10-13)

视频&#xff1a; https://www.bilibili.com/video/BV1CB4y1Z7kA 浅谈MDK, IAR, CLANG和GCC的局部变量字节对齐处理差异 问题由来&#xff1a; 早期这个帖子里面的局部变量对齐仅测试了MDK AC5&#xff0c;但项目中使用AC6发现了新问题&#xff0c;看来AAPCS规约研究的还是不…

centos 里面的service自启动app.jar,出现两个java进程,app是同一个端口

当使用jps -lv查看java虚拟机进程 app.jar启动后&#xff0c;居然出现两个启动进程&#xff0c;而且他们的端口都一样&#xff0c;同一端口&#xff0c;是不允许启动两个相同app的。 使用进程ps查看进程工具 #ps -aux 参数说明&#xff1a; a: 显示跟当前终端关联的所有进…

《Deep Residual Learning for Image Recognition》阅读笔记

论文标题 《Deep Residual Learning for Image Recognition》 撑起CV界半边天的论文Residual &#xff1a;主要思想&#xff0c;残差。 作者 何恺明&#xff0c;超级大佬。微软亚研院属实是人才辈出的地方。 初读 摘要 提问题&#xff1a; 更深层次的神经网络更难训练。 …

PHP基础语法(上)

目录 前言 一、基础语法 1.1 标记 1.2 输出语句 1.2.1 echo 1.2.2 print 1.3 注释 1.3.1 单行注释 1.3.2 多行注释 1.4 标识符 1.5 关键字 二、数据与运算 2.1 常量 2.1.1 常量的定义和使用 2.1.2 预定义常量 2.2 变量 2.2.1 变量的赋值 2.2.2 超全局变量 2.3 数据类型 2.3.1 …

Nginx:反向代理(示意图+配置)

示意图&#xff1a; 反向代理 反向代理&#xff08;Reverse Proxy&#xff09;是代理服务器的一种&#xff0c;它代表服务器接收客户端的请求&#xff0c;并将这些请求转发到适当的服务器。当请求在后端服务器完成之后&#xff0c;反向代理搜集请求的响应并将其传输给客户端。…

Tableau:商业智能(BI)工具

Tableau入门 1、Tableau概述2、Tableau Desktop2.1、初识Tableau Desktop2.2、Tableau工作区2.3、数据窗格与分析窗格2.4、功能区和标记卡2.4.1、列和行功能区2.4.2、标记卡2.4.3、筛选器功能区2.4.4、页面功能区2.4.5、附加功能区、图例、控件 3、Tableau视图4、Tableau工作簿…

LeetCode讲解篇之198. 打家劫舍

LeetCode讲解篇之198. 打家劫舍 文章目录 LeetCode讲解篇之198. 打家劫舍题目描述题解思路题解代码 题目描述 题解思路 该问题可以通过递推来完成 递推公式&#xff1a; 前n间房的最大金额 max&#xff08;前n-1间房的最大金额&#xff0c; 前n-2间房的最大金额第n-1间房的最…

Hadoop2.0探讨

文章目录 8. Hadoop 再探讨8.1 Hadoop的优化与发展8.2 HDFS 的FA和Federation(Hadoop2.0新特性)8.2.1 HDFS HA8.2.2 HDFS Federation 8.3 YARN8.3.1 MapReduce1.0的缺陷8.3.2 Yarn设计思路8.3.3 Yarn体系结构8.3.4 Yarn工作流程8.3.5 Yarn框架和MapReduce1.0框架对比分析8.3.6 …

asp.net酒店餐饮管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net酒店餐饮管理系统是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语言 开发 ASP.NE 酒店餐饮管理系统 二、功能…

AMD AFMF不但能用在游戏,也适用于视频

近期AMD发布了AMD Software Adrenalin Edition预览版驱动程序&#xff0c;增加了对平滑移动帧&#xff08;AMD Fluid Motion Frames&#xff0c;AFMF&#xff09;功能的支持&#xff0c;也就是AMD的“帧生成”技术&#xff0c;与DLSS 3类似&#xff0c;作为FidelityFX Super Re…

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

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

LeetCode【240】搜索二维矩阵

题目&#xff1a; 思路&#xff1a; 1、单靠对角线元素无法判定位置 2、主要逐行进行二分 代码&#xff1a; public boolean searchMatrix(int[][] matrix, int target) {int rows matrix.length;int columns matrix[0].length;// 按行进行二分for (int i 0; i < rows…