【Linux】调试器-gdb使用

大家好,我是苏貝,本篇博客带大家了解Linux的编译器-gcc/g++,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️
在这里插入图片描述


目录

  • 1. 背景
    • (A) 看大小
    • (B) 查看ELF格式的文件
  • 2.使用
    • (A) 进入gdb
    • (B) quit/q:退出gdb
    • (C) run/r:运行代码
    • (D) list/l:查看debug模式的可执行文件的依赖文件的内容
    • (E) b:打断点
    • (F) info/i b:显示断点信息
    • (G) disable 断点编号:使能关闭断点
    • (H) enable 断点编号:使能打开断点
    • (I) d/d 断点编号:删除断点
    • (J) next/n:逐过程,F10
    • (K) step/s:逐语句,F11
    • (L) print/p a/&a:查看变量a内容/地址
    • (M) display a/&a:一直查看变量a的值/地址
    • (N) undisplay 编号:取消对a/&a的一直查看
    • (O) continue/c:运行到下一个断点处
    • (P) 运行结束所在函数后就停下来
    • (Q) until:跳转到指定行,中间的代码都已执行
    • (R)info/I locals:查看当前栈帧局部变量的值

1. 背景

程序的发布方式有两种,debug模式和release模式 。其中,debug模式可被调试(编译器形成可执行程序的时候会给可执行程序 添加调试信息, release模式不能被调试
Linux 中gcc/g++出来的二进制程序,默认是release模式
要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项

如何证明由release变debug模式会添加调试信息呢?

(A) 看大小

先写出一个.c文件
在这里插入图片描述

再写出makefile的内容
在这里插入图片描述

Make生成mytest文件,它是可执行文件,是release模式的
在这里插入图片描述

修改makefile的内容

在这里插入图片描述

再生成mytest_debug文件,也是可执行文件,不过是debug模式的
在这里插入图片描述

我们发现,debug模式的文件大小大于release模式的

(B) 查看ELF格式的文件

readelf 命令,一般用于查看ELF格式的文件信息,常见的文件如在Linux上的可执行文件,动态库( * .so)或者静态库(*.a) 等包含ELF格式的文件。

在这里插入图片描述

Debug模式下比Release模式下多出了上图的可执行文件

以上2点可大体证明由release变debug模式会添加调试信息


2.使用

(A) 进入gdb

gdb +文件名,只有出现done才表示已经进入调试
在这里插入图片描述

(B) quit/q:退出gdb

在这里插入图片描述

© run/r:运行代码

(D) list/l:查看debug模式的可执行文件的依赖文件的内容

默认只显示10行
如果在进入调试并且操作后,在命令行直接按enter键,那么gdb执行的是上一条指令(例外:当上一条指令是list/l时,会打印出上一条指令下面的未打印的代码)

使用方式:

  1. list/l:将main函数作为中间,显示main函数的上下文
    在这里插入图片描述

  2. list/l 文件名:行号/函数名
    在这里插入图片描述
    在这里插入图片描述

  3. list/l 行号/函数名
    在这里插入图片描述

上面的3种方法都可以打印文件内容,可是我们发现代码大于10行,如何打印全部的代码呢?直接按enter键
在这里插入图片描述

当代码全部打印完后,再想打印就会跳出提示

(E) b:打断点

使用方法:

  1. b 行号/函数名
    在这里插入图片描述

  2. b 文件名:行号/函数名
    在这里插入图片描述

断点的作用:在run/r时,停在断点哪一行
在这里插入图片描述

注意:断点编号只会一直递增
如果我先删除编号为1的断点,即31行的断点,再在31行打断点,此时断电编号为5而非1

(F) info/i b:显示断点信息

在这里插入图片描述

断点信息:
Num:断点编号
Enb:使能,表示断电是否打开,y:打开,n:关闭

(G) disable 断点编号:使能关闭断点

未关闭断点2时,run/r停在第29行。关闭断点2,则停在31行
在这里插入图片描述

(H) enable 断点编号:使能打开断点

在这里插入图片描述

(I) d/d 断点编号:删除断点

d:删除所有的断点
d 断点编号:删除指定断点
在这里插入图片描述

(J) next/n:逐过程,F10

会一行一行的执行,如果遇到函数,则不进入函数,直接执行完函数

(K) step/s:逐语句,F11

会一行一行的执行,如果遇到函数,则进入函数

(L) print/p a/&a:查看变量a内容/地址

当我们用vs调试时,遇见循环时,能一边看着代码,一边看着变量的值/地址,Linux也可以实现
在这里插入图片描述
在这里插入图片描述

(M) display a/&a:一直查看变量a的值/地址

在上面的print/p命令中,想要知道每次循环时a/&a,就要在每次循环时print/p a/&a,很麻烦,且没有必要,所以出现了display,只要display a/&a,在每次循环时,自动出现a/&a

在这里插入图片描述

(N) undisplay 编号:取消对a/&a的一直查看

在这里插入图片描述

(O) continue/c:运行到下一个断点处

在这里插入图片描述

§ 运行结束所在函数后就停下来

在这里插入图片描述

(Q) until:跳转到指定行,中间的代码都已执行

在这里插入图片描述

(R)info/I locals:查看当前栈帧局部变量的值

在这里插入图片描述


好了,那么本篇博客就到此结束了,如果你觉得本篇博客对你有些帮助,可以给个大大的赞👍吗,感谢看到这里,我们下篇博客见❤️

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

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

相关文章

Mybatis进阶详细用法

目录 条件构造器 案例 自定义SQL 案例 Service接口 案例 综合案例 条件构造器 案例 Testvoid testQueryMapper() {// 创建 QueryWrapper 实例QueryWrapper<User> queryWrapper new QueryWrapper<>();queryWrapper.select("id," "username,&…

Linux系统编程:进程控制

1.进程创建 1.1 fork函数 fork&#xff08;&#xff09;通过复制调用进程来创建一个新进程。新进程称为子进程&#xff0c;是调用进程的精确副本 进程&#xff0c;但以下几点除外&#xff1a; 子进程有自己的PID&#xff0c;此PID与任何现有进程组的ID不匹配子进程的父进程ID…

【java-数据结构14-双向链表的增删查改2】

上一篇文章中&#xff0c;我们已经对双向链表进行一些基本操作&#xff0c;本篇文章我们继续通过对链表的增删查改来加深对链表的理解~同时有任何不懂的地方可以在评论区留言讨论&#xff0c;也可以私信小编~觉得小编写的还可以的可以留个关注支持一下~话不多说正片开始~ 注意…

【精读Yamamoto】方向性连接如何丰富神经网络的功能复杂度 | 体外神经元培养实验 | 脉冲神经元模型(SNN) | 状态转移模型

探索大脑的微观世界&#xff1a;方向性连接如何丰富神经网络的功能复杂度 在神经科学领域&#xff0c;理解大脑如何通过其复杂的网络结构实现高级功能一直是一个核心议题。最近&#xff0c;一项由Nobuaki Monma和Hideaki Yamamoto博士领导的研究为我们提供了新的视角&#xff…

Docker 入门篇(八)-- Docker Compose 使用指南

一、Docker Compose 简介 Docker Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose&#xff0c;您可以使用 YML 文件来配置应用程序需要的所有服务。然后&#xff0c;使用一个命令&#xff0c;就可以从 YML 文件配置中创建并启动所有服务。 Compose 使用…

记录接口请求偶发504 Gateway Time-out问题

项目场景&#xff1a; 我们将服务部署到A公司服务器中&#xff0c;使用了共五台服务器&#xff0c;分别是&#xff1a;1.NG服务器 2.日志服务器 3.缓存服务器 4.应用服务器1 5.应用服务器2 。而请求过来首先到达的是他们的物理代理服务器&#xff0c;然后再转发请求到我们的ng…

利用一段代码轻松绕过PHP授权系统

第一步&#xff1a;首先你需要改名全局文件 比如说全局文件 common.php&#xff0c;那么 你将他改为core.php 第二步&#xff1a;创建文件 创建一个文件&#xff0c;和改名前的全局文件名称一样&#xff0c;然后把以下代码复制进去就OK了 代码如下&#xff1a; <?php…

OFDM802.11a的FPGA实现(十四)data域的设计优化,挤掉axi协议传输中的气泡

原文链接&#xff08;相关文章合集&#xff09;&#xff1a;OFDM 802.11a的xilinx FPGA实现 目录 1.前言 2.data域的时序要求 3.Debug 1.前言 前面12篇文章详细讲述了&#xff0c;OFDM 802.11a发射部分data域的FPGA实现和验证&#xff0c;今天对data域的设计做一个总结。在…

【vue2项目经验总结:a标签干扰路由】

当我们点击页面中的a标签实现跳转时&#xff0c;会发现网页上方的路由也切换成了a标签的id值&#xff1a; 刷新后页面也会变成空白&#xff1a; 解决方法&#xff1a; 添加Click方法&#xff0c;传入的参数与id值保持一致 scrollIntoView() 方法&#xff0c;将该元素滚动到…

快解析Tplink端口映射如何设置

Tplink作为国内知名路由器品牌&#xff0c;有着广泛的用户群体。使用快解析端口映射是实现内网服务器被外网访问必须要做的设置&#xff0c;很多对网络不懂得小白不知道该到哪里去做&#xff0c;下面我就讲解一下tplink路由器如何做端口映射。 1&#xff1a;访问路由器 &#…

Peter算法小课堂—序列切割

讲序列切割之前&#xff0c;先来个铺垫 高手集训 题目描述&#xff1a; 课程表里有连续的n天可以供你选择&#xff0c;每天都有专题课程。其中第i天的专题趣味程度为h[i]。假设你选择了其中连续的若干天&#xff0c;从第l天到第r天。那么&#xff0c; 训练效果 h[l]*1 h[…

【实践】使用vscode来debug go程序的尝鲜

配置 首先&#xff0c;当然得配置好vscode 的go环境&#xff0c; 装个go插件就基本满足了 配置 launch.json, 可以配置多个环境的程序启动参数&#xff08;很友好&#xff09; {"version": "0.2.0","configurations": [{"name": &…