Linux调试器gdb的用法

Linux调试器gdb的用法

  • 1. debug/release版本之间的比较
  • 2. gdb调试器的基本指令
  • 3. 使用展示

1. debug/release版本之间的比较

在之前学习C语言的的时候出过一期vs的调试技巧。
而对于现在的Linux下的调试器gdb其实也是换汤不换药的,基本上的调试思路是不会改变的,改变的只是工具使用上。

  • Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。(可调试)
  • Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优 的,以便用户很好地使用。(不可调试)。所以debug版本下是要存放一些调试信息的,侧面说了,debug版本下生成的可执行文件的体积是会更大的。
  • 这里要注意的是,我们Linux默认执行的是release版本的,如果要使其执行的是debug版本的话要加上选项-g

gcc -o 生成可执行文件 原文加 -g

在这里插入图片描述

  • 这里建议写在makefile文件中,直接make即可。
  • 如果还没有下载gdb调试工具的话执行以下指令:

sudo yum install -y gdb

2. gdb调试器的基本指令

指令功能
list或 l 行号展示所对应的行号的代码
b + 行号 / b + 函数名/ b 文件名称:行号给指定行号断点,对一个vs的快捷键F9
(delete breakpoints) d + 编号删除指定行号断点
info b 或 info break查看断点信息
run 或 r运行代码,对应vs的快捷键F5
disable + 断点编号禁用断点
enable + 断点编号开启断点
next或n逐过程调试代码,对应vs的快捷键F10
step或s逐语句调试代码,对应vs的快捷键F11
print§:打印表达式的值,通过表达式可以修改变量的值或者调用函数
p + 变量查看变量内容
display + 变量长显示变量内容,跟踪查看一个变量,每次停下来都显示它的值
undisplay + 编号删除长显示
continue或c从一个断点运行到下一个断点
breaktrace或bt调用堆栈。查看各级函数调用及参数
finish将一个函数运行结束后停止。执行到当前函数返回,然后挺下来等待命令
until + 行号在一定范围内,直到运行到指定行号运行停止
set var name=value修改变量name的内容为value
quit退出gdb

3. 使用展示

gdb 可执行文件
进入调试模式

在这里插入图片描述

  1. l 行号
    显示源代码,每次展示10行代码,但是gdb默认会记住上一次使用的指令,所以只需要一直按回车就可以直接执行并展示所有的代码。
    在这里插入图片描述
  2. (b 行号/b 函数名/b 文件名:行号)以及(info b)
    打断点相当于我们使用vs时的快捷键F9.
    1. b 行号打断点
    2. b 函数名打断点
    3. b 文件名:行号打断点
  • info b查看断点信息
    查看断点信息的时候,引入了断点编号的概念。也就是说gdb识别断点的方式并不是使用行号识别的,而是使用编号识别的,我们每设置一个断点信息,编号都会自增,只有当我们退出gdb调试后再次进入编号才会被刷新。
    而这个编号在我们删除编号,使能断点的时候都要用到。
    在这里插入图片描述
  1. d 断点编号
    d 断点编号 是删除断点信息的。断点编号需要用info b查看断点信息查看。
    在这里插入图片描述

  2. run或r运行代码
    如果有断点,则会运行到断点处停止运行。
    在这里插入图片描述

  3. disable/enable打开/关闭断点
    有的时候我们设置了断点,但是为了测试另一部分代码,可能要删除当前的断点,但是当前的断点可能下次也是需要用到的,于是就可以将断点暂时关闭使用disable,要用到的时候打开断点enable
    在这里插入图片描述
    在这里插入图片描述

  4. next或n逐过程编译/step或s逐语句编译
    n逐过程编译相当于vs的快捷键F10,进行逐条语句编译。
    s逐语句编译相当于vs的快捷键F11,进行逐过程编译。
    在这里插入图片描述

  5. p 变量名——查看变量内容
    用于显示变量的内容,但是缺点是只能显示一次,如果还想再看,只能重新输入指令。
    在这里插入图片描述

  6. display 变量/undispaly 变量
    display——可以长时间显示变量的值,可以进行时事更新变量的值
    undisplay——删除长显示变量
    在这里插入图片描述

  7. continue或n
    跳转断点。运行两个端点之间的代码,会从一个断点运行到另一个断点后停止。
    在这里插入图片描述

  8. bt
    调用堆栈。
    在这里插入图片描述

  9. finish
    finish——将一个函数运行完后停止。
    有时候我们debug代码的时候,确定了就是在这几个函数中的其中一个函数出错了,这个时候我们就要对函数一一排查,把每一个函数到debug以下。
    在这里插入图片描述

  10. until 行号
    until在一个范围内指定运行到指定的行号。
    在这里插入图片描述

  11. set var name=value
    我们都知道,一个已经运行起来的代码中的变量不能不能别修改了。但是gdb中可以在调试的时候修改这个变量的值。
    在这里插入图片描述
    我在函数部分加上了一个判断结构,正常情况下都是会执行printf(sum)这个函数的。
    在这里插入图片描述
    但是我们可以让它输出haha
    在这里插入图片描述
    这个功能用于我们debug的时候,用来判断语句,但是不知道是哪一部份出错了,就要手动去修改值,让调试的时候进入指定的判断里面去debug,但是有了这个指令就不需要了。
    注:这个修改不是本质上的修改,只是名义上的修改,一旦退出被修改的值会恢复原来的值。

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

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

相关文章

FreeSWITCH 1.10 源码阅读(7)-uuid_bridge 命令原理解析

文章目录 1. uuid_bridge 命令执行2. 源码分析3. uuid_bridge 问题处理 1. uuid_bridge 命令执行 uuid_bridge 命令用于将两条腿桥接在一起,以实现双方的通话。下图是该命令在 FreeSWITCH 中的处理流程,大致的流程可以分成以下几个步骤: uui…

cmake 删除install安装的文件

目的 在CMakeLists.txt 中的install 可以通过 make install 或者 cmake --build build --target install 时安装,但是卸载的时候,就问题比较大了。 通过下面的方式去解决 方式一 创建文件cmake_uninstall.cmake.inif(NOT EXISTS "@CMAKE_BINARY_DIR@/install_manife…

手写单链表(指针)(next域)附图

目录 创建文件: 具体实现: 首先是头插。 注意:一定要注意:再定义tmp时,要给它赋一个初始值(推荐使用 new list_next) 接着是尾插: 随后是中间插: 然后是最简单的改值&#xf…

JS - 设计模式持续学习中

通过例子持续学习JS设计模式中,接下来请跟随我的步伐走进我的学习笔记世界~ 什么是设计模式?我们为什么需要学习设计模式? 设计模式是可以更好解决问题的一种方案。 这意味着什么?如果你开发的项目的功能是固定的,永…

Java中的继承

继承 什么是继承继承的特点继承后对象的创建 继承的好处与应用场景继承相关注意事项权限修饰符单继承、Object类方法重写什么是方法重写 子类中访问其他成员的特点子类构造器的特点 什么是继承 Java中提供了一个关键字extends,用这个关键字,可以让一个类…

【自用】Ubuntu20.4从Vivado到ddr200t运行HelloWorld

【自用】Ubuntu20.4新系统从输入法到ddr200t运行HelloWorld 一、编辑bashrc二、Vivado2022.2安装三、编译蜂鸟E203自测样例1. 环境准备2. 下载e203_hbirdv2工程文件3. 尝试编译自测案例1. 安装RISC-V GNU工具链2. 编译测试样例 4. 用vivado为FPGA生成mcs文件1.准备RTL2.生成bit…

对大学生创新创业某赛事目前存在的烂尾楼现象的一些研究的分享(1)

经过对”某某网”大学生创新创业大赛国赛第五届-第八届部分金奖项目的研究,进行较为充分的信息溯源、穿透调查,我发现不少项目存在赛事材料画大饼,严重不切合实际,参赛人员并非真正创新创业,赛后迅速销声匿迹、烂尾切割…

图论 | 网络流的基本概念

文章目录 流网路残留网络增广路径割最大流最小割定理最大流Edmonds-Karp 算法算法步骤程序代码时间复杂度 流网路 流网络: G ( V , E ) G (V, E) G(V,E) 有向图,不考虑反向边s:源点t:汇点 c ( u , v ) c(u, v) c(u,v)&#xff…

你以为出现NoClassDefFoundError错误会是什么原因?

你以为出现NoClassDefFoundError错误会是什么原因? 1、概述2、事情经过3、总结 1、概述 大家好,我是欧阳方超,可以关注我的公众号“欧阳方超”,后续内容将在公众号首发。 同样的错误,非一样的解决方式。NoClassDefFou…

电商系统订单到期关闭如何实现(订单超时未支付自动取消)

在电商,支付等系统中,一设都是先创建订单(支付单),再给用户一定的时间进行支付,如果没有按时支付的 话,就需要把之前的订单(支付单)取消掉。这种类以的场景有很多,还有比…

【智慧校园】基于国标GB28181协议EasyCVR视频技术的高校宿舍智能监管方案

现如今,各大学校不乏众多住校生,但由于很多学生年龄较小 ,又缺乏独自生活的经历,如何给在校住宿生做到安全与生活双重保障?旭帆科技校园智能视频监控通过人工智能技术对住宿区域进行智能监管,确保学生住宿安…

【HCIP学习记录】OSPF Hello报文及状态机

字段长度含义Version1字节版本,OSPF的版本号。对于OSPFv2来说,其值为2。Type1字节类型,OSPF报文的类型,有下面几种类型: 1:Hello报文;● 2:DD报文;● 3:LSR报…

MySQL_15.UNDO和REDO的区别

redo 重做日志(redo)包含所有数据产生的历史改变记录,是oracle在线或归档重做日志文件中记录的信息, 一旦掉电或其他意外丢失数据,可以利用这些数据来重做事务,例如已经出现了丢失数据的情况, 那…

肺癌相关知识

写在前面 大概想了解下肺癌相关的知识,开此贴做记录,看看后续有没有相关的生信文章思路。 综述 文章名期刊影响因子Lung cancer immunotherapy: progress, pitfalls, and promisesMol Cancer37.3 常见治疗手段有surgery, radiation therapy, chemoth…

【终极教程】cocos2dx-js 分批次混淆压缩js文件

​ 说明: 1> 由于我们当前游戏框架的结构是平台形式的就是一个大厅里面有若干个子游戏,所以在发布的时候得区分子游戏和大厅了解了一下 project.json 里面有一个 jsList 可以把所有放进去的js文件压缩混淆成一个大的文件但是我们游戏的子游戏非常多 这样子弄显然不合适&…

青少年CTF-qsnctf-Web-登陆试试

题目环境: 题目难度:★题目描述:Syclover用户忘了他的密码,咋办哦,依稀记得密码为6位数字,以774开头,这次我们来爆爆他的密码,让他再也不犯相同的错了 先不着急进行爆破 看看源码里面有没有其它有用的信息 …

Shell三剑客:awk(内部变量)

一、$0 :完整的输入记录 [rootlocalhost ~]# awk -F: {print $0} passwd.txt root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/s…

软件分享--图片置顶工具

一个好的程序应该只做一件事情,并且将这件事情做好。 使用许多小工具的集合要比使用一个什么都做但什么都做不好的工具要好。 linux系统强大,组成它的是dd、sed、grep、awk、tar等各种命令工具的集合。 如果你能够合理使用各种小工具。效率会比使用任何…

【python】作用域与闭包 || global与nonlocal

python作用域 其他语言的作用域:块级、函数、类、模块、包等由小到大的级别但是python没有块级(if语句块、for语句块),所以if中定义的变量,相当于普通语句 >>> if True: # if语句块没有作用域x …

OPPO R11刷机过程记录

一、步骤: 1、下载对应的OPPO R11的USB驱动: oppo r11驱动|oppo r11手机驱动下载v2.0.0.1官方版 - 欧普软件园 2、数据线连接电脑与手机 21)长按音量上下电源3个按键10秒,进入9008模式 22) 打开奇兔刷机-实用工具…