Linux调试器-gdb使用

文章目录

  • 前言
  • 一、pandas是什么?
    • 1、gdb介绍
    • 2、gdb使用
      • 2.1 启动gdb和退出gdb
      • 2.2 list显示代码命令
      • 2. run运行程序命令
      • 2.3 break设置断点命令
      • 2.4 delete删除断点命令
      • 2.5 next逐过程执行命令
      • 2.6 step逐语句向下执行命令
      • 2.7 print打印表达式值命令
      • 2.8 bt命令和finish命令
      • 2.9 display命令和undisplay命令
      • 2.10 until命令
      • 2.11 continue命令
      • 2.13 disable命令和enable命令
      • 2.14 set var 命令


前言


提示:以下是本篇文章正文内容,下面案例可供参考

一、pandas是什么?

1、gdb介绍

GDB 全称“GNU symbolic debugger”,从名称上不难看出,它诞生于 GNU 计划(同时诞生的还有 GCC、Emacs等),是 Linux 下常用的程序调试器。发展至今,GDB 已经迭代了诸多个版本,当下的 GDB 支持调试多种编程语言编写的程序,包括 C、C++、Go、Objective-C、OpenCL、Ada 等。实际场景中,GDB 更常用来调试 C 和 C++ 程序。
所谓调试(Debug),就是让代码一步一步慢慢执行,跟踪程序的运行过程。比如,可以让程序停在某个地方,查看当前所有变量的值,或者内存中的数据;也可以让程序一次只执行一条或者几条语句,看看程序到底执行了哪些代码。
我们知道程序的发布方式有两种,debug模式和release模式,而Linux gcc/g++出来的二进制程序,默认是release模式,所以直接使用gdb调试器是无法进行调试的。因为release版本的可执行程序不包含调试信息。
我们可以看到使用gcc编译生成的test文件在使用gdb调试时,找不到调试信息。
在这里插入图片描述
所以在使用gcc编译时需要加上-g选项,即代表生成的可执行文件为debug版本的。debug版本使用gdb调试时就会包含调试信息。并且我们可以看到debug版本的可执行程序要比release版本的可执行程序大。

gcc test.c -o test_debug -g
gdb test_debug

在这里插入图片描述
并且我们可以通过readelf -S命令查看可执行程序的执行段。

readelf -S test

在这里插入图片描述
我们使用readelf命令在程序执行段信息中查找关于debug的信息。可以看到在release版本的test文件中查找不到关于debug的程序执行段。而在debug版本的test_debug文件中可以查找到关于debug的程序执行段。

readelf -S test | grep -i debug

在这里插入图片描述

readelf -S test_debug | grep -i debug

在这里插入图片描述

2、gdb使用

我们先创建一个test.c文件,然后写入如下代码。
在这里插入图片描述
然后我们将makefile文件配置如下。
在这里插入图片描述
然后我们执行make命令就可以将test.c文件生成debug版本的可执行文件test。
在这里插入图片描述

2.1 启动gdb和退出gdb

//使用gdb调试test文件
gdb test//退出gdb
quit

在这里插入图片描述

2.2 list显示代码命令

简记为 l ,其作用就是列出程序的源代码,默认每次显示10行。
list 行号:将显示当前文件以“行号”为中心的前后10行代码,如:list 12
list 函数名:将显示“函数名”所在函数的源代码,如:list main
list :不带参数,将接着上一次 list 命令的,输出下边的内容。
gdb会记录最近一条命令,如果命令无变化,可以直接回车。

//表示从第0行开始显示代码
list 0
//表示以行号10为中心,打印5-14这10行的代码
l 10

在这里插入图片描述
在这里插入图片描述
注意 :如果运行list 命令得到类似如下的打印,那是因为在编译程序时没有加入 -g 选项,即该执行文件为release版本。
在这里插入图片描述

2. run运行程序命令

简写为 r,其作用是运行程序,当遇到断点后,程序会在断点处停止运行,等待用户输入下一步的命令。
r或run:运行程序。

run
r

在这里插入图片描述

2.3 break设置断点命令

break(b) + 行号:在某一行设置断点。
break 函数名:在某个函数开头设置断点。
info break :查看断点信息。

在这里插入图片描述

2.4 delete删除断点命令

delete 简写为 d + 断点编号(删除断点不能加断点行号):删除断点。
在这里插入图片描述

2.5 next逐过程执行命令

next 简写 为n:逐过程向下执行(即不进入函数内部,直接跳过函数向下执行),相当于VS中的F10。
在这里插入图片描述

2.6 step逐语句向下执行命令

step:简记为 s ,单步跟踪程序,当遇到函数调用时,则进入此函数体(一般只进入用户自定义函数)。相当于VS中的F11。
在这里插入图片描述

2.7 print打印表达式值命令

print 表达式:简记为 p ,其中“表达式”可以是任何当前正在被测试程序的有效表达式,比如当前正在调试C语言的程序,那么“表达式”可以是任何C语言的有效表达式,包括数字,变量甚至是函数调用。
print a:将显示整数 a 的值
print &a:将变量a的地址打印出来
print ++a:将把 a 中的值加1,并显示出来
print name:将显示字符串 name 的值
print gdb_test(22):将以整数22作为参数调用 gdb_test() 函数
print gdb_test(a):将以变量 a 作为参数调用 gdb_test() 函数
在这里插入图片描述

2.8 bt命令和finish命令

bt:显示当前程序的函数调用堆栈。
finish: 运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息。
在这里插入图片描述

2.9 display命令和undisplay命令

display 表达式:在单步运行时将非常有用,使用display命令设置一个表达式后,它将在每次单步进行指令后,紧接着输出被设置的表达式及值。
display + 变量名:设置该变量常显示。
在这里插入图片描述
在这里插入图片描述
undisplay + 常显示变量编号:取消常显示。(注意不能再后面加变量名,而是需要加常显示变量的编号)
在这里插入图片描述

2.10 until命令

until + 行号:跳转到指定行,不建议从这个函数跳转到另一个函数。直接跳过循环而来到该行号,即当我们不想一步一步执行循环,而是想直接执行完时,可以使用该命令。
在这里插入图片描述

2.11 continue命令

当我们设置多个断点时,当想从第一个断点直接跳到下一个断点时,可以使用continue命令。
在这里插入图片描述

2.13 disable命令和enable命令

disable 简写为 disa + 断点序号:表示将该断点设置为禁用,此时在执行时会就不会在该断点处停止。
在这里插入图片描述
enable + 断点序号:表示将该断点重新设置为可用。

在这里插入图片描述

2.14 set var 命令

set var 变量名 = :设置变量为新的值。

在这里插入图片描述

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

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

相关文章

初识C语言——详细入门一(系统性学习day4)

目录 前言 一、C语言简单介绍、特点、基本构成 简单介绍: 特点: 基本构成: 二、认识C语言程序 标准格式: 简单C程序: 三、基本构成分类详细介绍 (1)关键字 (2&#xf…

插拔结构脉冲离子风工作原理

脉冲离子风机有着特殊的结构-插拔结构,清洁保养维修更简单、更安全;核心部件模块化;它有着超强的消除静电能。 脉冲台式离子风机的安装方法:将离子风机置于台面上或悬挂于台面上,插上电源插头,打开风机,调节…

微信群发一次能发1000个好友了!你发现了吗?

微信作为我们日常交流的主要工具之一 群发功能在我们的日常生活中也非常实用 但有时候 比如在新年期间 需要向所有客户发送祝福时 在公司做活动期间 向所有客户发起邀约时 如果一个一个点击来发送信息 会非常麻烦 但是!! 我今天发现微信 已经…

部署ik分词器

部署ik分词器 案例版本:elasticsearch-analysis-ik-8.6.2 ​ ES默认自带的分词器对中文处理不够友好,创建倒排索引时可能达不到我们想要的结果,然而IK分词器能够很好的支持中文分词 ​ 因为是集群部署,所以每台服务器中的ES都需…

HarmonyOS应用开发—资源分类与访问

应用开发过程中,经常需要用到颜色、字体、间距、图片等资源,在不同的设备或配置中,这些资源的值可能不同。 应用资源:借助资源文件能力,开发者在应用中自定义资源,自行管理这些资源在不同的设备或配置中的表…

C语言指针,深度长文全面讲解

指针对于C来说太重要。然而,想要全面理解指针,除了要对C语言有熟练的掌握外,还要有计算机硬件以及操作系统等方方面面的基本知识。所以本文尽可能的通过一篇文章完全讲解指针。 为什么需要指针? 指针解决了一些编程中基本的问题。…

9.19作业

TCP服务器 //创建流式套接字int sfd socket(AF_INET, SOCK_STREAM, 0);if(sfd < 0){ERR_MSG("socket"); return -1;}printf("socket create success sfd%d\n", sfd);//允许端口快速复用in…

MQTT Paho Android 支持SSL/TLS(亲测有效)

MQTT Paho Android 支持SSL/TLS(亲测有效) 登录时支持ssl的交互 这是调测登录界面设计 代码中对ssl/tls的支持 使用MqttAndroidClient配置mqtt客户端请求时&#xff0c;不加密及加密方式连接存在以下几点差异&#xff1a; url及端口差异 val uri: String if (tlsConnect…

[npm]脚手架本地全局安装1

[npm]脚手架本地全局安装1 npm link 全局安装npm install 全局安装卸载全局安装的脚手架 该文章是你的脚手架已经开发完成的前提下&#xff0c;你想要本地全局安装该脚手架&#xff0c;便于本地使用脚手架的命令的情况 npm link 全局安装 如果本地开发的项目是个脚手架&#…

《数据结构、算法与应用C++语言描述》使用C++语言实现二维数组下三角矩阵

《数据结构、算法与应用C语言描述》使用C语言实现二维数组下三角矩阵 下三角矩阵定义 如下图所示&#xff1a; 代码实现 _11lowerTriangularMatrix.h 模板类 /* Project name : allAlgorithmsTest Last modified Date: 2022年8月13日17点38分 Last Version: V1.0 D…

oracle创建表空间、用户、权限以及导入dmp文件

创建表空间 create tablespace A_DATA logging datafile F:\CODEAPP\ORACLE\ORADATA\A_DATA01.DBF size 50m autoextend on next 50m maxsize 32767m extent management local; -- 这个语句将创建一个大小为50MB的数据文件&#xff0c;启用自动扩展功能&#xff0c;每次扩展50…

Java21 LTS版本

一、前言 除了众所周知的 JEP 之外&#xff0c;Java 21 还有更多内容。首先请确认 java 版本&#xff1a; $ java -version openjdk version "21" 2023-09-19 OpenJDK Runtime Environment (build 2135-2513) OpenJDK 64-Bit Server VM (build 2135-2513, mixed mo…

zemax像质评价

1、外形图 1.1二维外形图 如图所示&#xff0c;展示镜头的侧面图 可以通过设置改变图中显示的内容&#xff1a; 起始面&#xff1a;绘图的第一个面 终止面&#xff1a;绘图的最后一个面 光线数&#xff1a;画出的光线数&#xff08;上图中的一个颜色就是7根线&#xff09; …

使用Visual Leak Detector排查内存泄漏问题

目录 1、VLD工具概述 2、下载并安装VLD 2.1、下载VLD 2.2、安装VLD 3、VLD安装目录及文件说明 3.1、安装目录及文件说明 3.2、关于32位和64位版本的详细说明 4、在工程中引入VLD 5、内存泄漏检测实例讲解 5.1、程序启动报错 5.2、启动调试&#xff0c;查看内存泄漏报…

【深度学习-第3篇】使用MATLAB快速实现CNN分类(模式识别)任务,含一维、二维、三维数据演示案例

在本文中&#xff0c;我们将介绍如何使用 MATLAB 中的 Convolutional Neural Network&#xff08;CNN&#xff09;进行分类任务。我们将使用 MATLAB 的 Deep Learning Toolbox 来创建、训练和评估 CNN。 一、一个简单的案例 1 安装和准备 首先&#xff0c;确保已安装 MATLAB…

Prometheus+Grafana可视化监控【Redis状态】

文章目录 一、安装Docker二、安装Redis数据库(Docker容器方式)三、安装Prometheus四、安装Grafana五、Pronetheus和Grafana相关联六、安装redis_exporter七、Grafana添加Redis监控模板 一、安装Docker 注意&#xff1a;我这里使用之前写好脚本进行安装Docker&#xff0c;如果已…

华为云云耀云服务器L实例评测|认识redis未授权访问漏洞 漏洞的部分复现 设置连接密码 redis其他命令学习

前言 最近华为云云耀云服务器L实例上新&#xff0c;也搞了一台来玩&#xff0c;期间遇到过MySQL数据库被攻击的情况&#xff0c;数据丢失&#xff0c;还好我有几份备份&#xff0c;没有造成太大的损失。昨天收到华为云的邮箱提醒&#xff0c;我的redis数据库没有设置密码&…

人声分离网站,帮你快速提取视频中的人声和背景音乐

今天给大家带来一个可以分离人声的网站——音分轨&#xff0c;他运用人工智能算法可以将音频中的人声部分和音乐部分分离&#xff0c;使我们的视频制作过程可以更方便。 我们点击右下角“选择文件”上传一个音频&#xff0c;上传好音频后&#xff0c;人工智能就开始处理我们上传…

使用Chatgpt编写的PHP数据库pdo操作类(增删改查)

摘要 将PDO封装成PHP类进行调用有很多好处&#xff0c;包括&#xff1a; 1、封装性和抽象性&#xff1a; 通过将PDO封装到一个类中&#xff0c;您可以将数据库操作逻辑与应用程序的其他部分分离开来&#xff0c;提高了代码的组织性和可维护性。这样&#xff0c;您只需在一个地…

python 学习笔记(6)—— Flask 、MySql

目录 Flask 1、起步 2、渲染项目的首页 3、处理无参数的 GET 请求 4、处理有 query 参数的 GET 请求 6、处理 params 参数的 get 请求 6、处理 application/json 类型请求体的 POST 请求 7、根据参数渲染模板页面 8、上传文件 数据库操作&#xff08;mysql&#xff0…