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

【Linux系统】第七篇:Linux调试器gdb的使用

文章目录

  • 一、gdb简介
  • 二、gdb的安装
  • 三、gdb使用
    • 3.1、release和debug版本
    • 3.2、gdb基本使用命令
      • 1、启动gdb
      • 2、调试命令
      • 3、显示代码(list)
      • 4、断点命令(breakpoint)
      • 5 、变量命令(variable)
      • 6、特殊调试命令
      • 7、调用堆栈命令
      • 8、显示当前函数内临时变量:info locals

一、gdb简介

GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。 对于一名Linux下工作的c/c++程序员,gdb是必不可少的工具;

二、gdb的安装

sudo yum install -y gdb

三、gdb使用

3.1、release和debug版本

在进行程序开发的过程中,有两个版本,一个是release版本,一个是debug版本。我们都知道,如果要进行调试程序,这个程序必须的debug版本的我们才可以进行调试的。

在Linux中查看程序版本:

readelf -S test

在这里插入图片描述
这里我们可以发现并没有关于debug的信息。其实在Linux中,gcc/g++编译器默认生成的版本是release版本的,如果想进入debug版本,我们就要带-g选项

gcc mytest.c -o mytest -g

在这里插入图片描述
在这里插入图片描述
总结:

  • 程序的发布方式有两种,debug模式和release模式
  • Linux中gcc/g++编译器默认生成的可执行程序是release模式
  • 要使用gdb调试,必须加上 -g 选项

3.2、gdb基本使用命令

1、启动gdb

gdb + 可执行程序文件,如下:

gdb mytest_g 
gdb -q mytest_g //表示不打印gdb版本信息,界面较为干净;

在这里插入图片描述

在这里插入图片描述

2、调试命令

与vs中的调试命令进行对比:
gdb中:

名称命令解释
开始运行run(r)相当于开始调试F5,执行代码后会在断点处停下
逐语句step(s)相当于F11,有函数会进入函数内部
逐过程next(n)相当于F10,不会进入函数内部,执行整条语句;

像逐过程、逐语句这样的命令一次输入之后,可直接回车仍会再次执行。

vs2019中:
在这里插入图片描述
运行演示:

  1. 直接调试
    在这里插入图片描述

  2. 逐过程
    在这里插入图片描述

  3. 逐语句
    在这里插入图片描述

3、显示代码(list)

名称命令解释
可指定行号list(l) + [N]从第 N 行开始显示 10 行代码,可接着上次的位置继续打印
可指定函数名list(l) + Name从函数起始位置左右开始显示代码

在这里插入图片描述

4、断点命令(breakpoint)

名称命令解释
某行打断点b + N在某行打上断点
函数打断点b + FuncName在函数内起始位置打断点
查看断点info + b显示断点信息列表
删除断点d + N删除序号为 N 的断点,省略序号就是删除所有断点
启用断点enable + N 启用序号为 N 的断点,省略序号就是启用所有断点
禁用断点disable + N禁用序号为 N 的断点,省略序号就是禁用所有断点

在这里插入图片描述

5 、变量命令(variable)

名称命令解释
监视变量display + ValName以列表的形式常显示在屏幕下方,类似于vs中的监视
取消监视undisplay + N去掉监视列表中的序号为 N 的变量的常显示
查看变量p + Name打印变量的值,不会常显示
修改变量set + Name设置指定变量的值

在这里插入图片描述

6、特殊调试命令

名称命令解释
结束当前函数finishfinish 会直接结束当前函数的调用,并停止在函数返回位置
继续运行continue(c)continue 继续运行至下一个断点,相当于F5
运行至指定行until + N运行至当前函数内部的第 N 行

在这里插入图片描述

在这里插入图片描述

7、调用堆栈命令

名称命令解释
调用堆栈breaktrace/bt查看程序各级栈帧的调用情况

在这里插入图片描述

8、显示当前函数内临时变量:info locals

名称命令解释
显示当前函数内临时变量info locals显示当前函数内临时变量

在这里插入图片描述

http://www.lryc.cn/news/13932.html

相关文章:

  • Shell 特殊变量及其含义
  • LeetCode 2396. 严格回文的数字
  • 【RocketMQ】源码详解:Broker启动流程
  • vue事件
  • 研报精选230220
  • kubernetes sd configs配置详解
  • Linux查看文件的命令
  • 如何单独清除某个网页的缓存(reload)
  • 魔兽世界经典怀旧服务器架设教程
  • Interview系列 - 05 Java|Iterator迭代器|集合继承体系|Set List Map接口特性|List实现类区别
  • LeetCode 1769. 移动所有球到每个盒子所需的最小操作数
  • MKS SKIPR V1.0船长版(Voron 2.4 R2)配置简要笔记
  • 90后,转行软件测试3年,从月入7000+到月入过万,整理出的这一万字经验分享。
  • Java之关于String字符串笔试面试重点
  • mdio协议
  • kubectl命令
  • 题库-JAVASE01
  • Java序列化机制
  • 3款强大到离谱电脑软件,都是效率神器,从此远离加班
  • 【项目】Vue3+TS CMS 登录模块搭建
  • Java 8 的那些常见写法
  • PyQt5数据库开发1 4.3 QSqlTableModel 之 相关槽函数的实现(多图长文详解)
  • QT 设计一个串口调试工具,用一个工程就能轻松解决,外加虚拟串口工具模拟调试,在日常工作中可类比模块间通信,非常详细建议收藏
  • OpenSumi 是信创开发云的首选
  • JdbcTemplate常用方法解析
  • 生物素标记试剂1869922-24-6,Alkyne-PEG3-Biotin PC,炔烃PEG3生物素PC
  • CS224W课程学习笔记(三):DeepWalk算法原理与说明
  • rk3568 开发板Ubuntu系统说明
  • Windows和Linux常用HASH算法使用命令
  • 货仓选址 AcWing(JAVA)