【Linux】Linux调试器--gdb的使用

news/2025/1/15 18:10:03/

有时候,我们并不需要被教导,而是应该被不断的提醒。
在这里插入图片描述

文章目录

  • 一、gdb的介绍
  • 二、debug和realease版本的区别
  • 三、gdb的使用
    • 1.显示代码: l+行号(list)指令
    • 2.设置断点: b+行号(breakpoint)
    • 3.查看断点: info b
    • 4.取消断点: d + 断点编号
    • 5.调试运行:r(run)
    • 6.逐过程:n(next)
    • 7.逐语句:s(step)
    • 8.运行至下一个断点处:c(continue)
    • 9.查看函数调用堆栈:bt
    • 10.直接运行完当前函数,然后返回到调用地方:finish
    • 11.临时查看变量或地址的值:p + 变量或地址
    • 12.监视跟踪查看/取消监视跟踪查看:display/undisplay
    • 13.跳转到指定行:until+行号
    • 14.修改变量的值:set var
    • 15.查看当前栈帧局部变量的值:info locals
    • 16.禁用/启用断点:disable/enable 断点编号



一、gdb的介绍

1.
gdb是linux上面的调试器,是非图形化界面纯命令行调试的,用起来非常的麻烦!

2.
安装gdb工具的命令

sudo yum install -y gdb

3.
默认情况下,gdb无法进行对gcc现在发布的程序进行调试,因为gcc默认生成的软件是realease版本的,没有调试信息,无法被调试器gdb调试,并且gcc是默认动态链接的,如果想静态链接还需要加static选项,所有gcc是有两种默认行为的。

4.
gcc编译时添加-g选项可以使得gcc发布的程序软件为debug版本,这样就可以通过gdb对程序进行调试

mytest_g:mytest.cgcc mytest.c -g -o mytest_g.PHONY:clean
clean:rm -f mytest_g

二、debug和realease版本的区别

1.
debug是给程序员用的版本,添加了调试信息,用于解决软件或程序中出现的问题,realease是发行给客户使用的版本,并未添加调试信息,只需要给客户提供优越的产品使用环境即可,至于是否能够debug调试,这是程序员才应该关心的主要问题。

2.
可以看到debug版本的字节大小是要大于realease版本的,这是因为其中添加了调试信息。

在这里插入图片描述
3.
通过指令可以读取可执行程序的二进制构成,显示出具体的二进制软件的内部所形成的特定格式。
值得注意的是:每一个二进制程序不仅仅只是一堆二进制代码,他们内部都是有特定格式的,Linux中形成的可执行程序是elf格式。

想要了解elf格式的可以去看看 深入了解计算机系统这本书

[wyn@VM-8-2-centos test_dir]$ readelf -S mytest_g | grep debug

下面就是debug中所添加的调试信息,而realease版本是没有这些调试信息的
在这里插入图片描述

三、gdb的使用

1.显示代码: l+行号(list)指令

gdb会默认记住历史上曾经输入的指令,l+0输入后gdb会从第零行开始显示部分的代码,我们继续回车便可以显示后半部分的代码,直到显示完停止
在这里插入图片描述

2.设置断点: b+行号(breakpoint)

在这里插入图片描述

3.查看断点: info b

在这里插入图片描述
在这里插入图片描述

4.取消断点: d + 断点编号

在这里插入图片描述

5.调试运行:r(run)

vs2022环境:
1.运行调试:fn+f5如果有断点,就停下来,如果没有断点就直接运行起来,如果想要跳到下一个断点,可以继续按fn+f5
2.取消调试:fn+shitf+f5
3.直接运行:fn+crtl+f5直接运行,有断点也不会调试

linux环境
1.直接运行:./+二进制可执行程序
2.调试运行:run

在这里插入图片描述

6.逐过程:n(next)

在这里插入图片描述

7.逐语句:s(step)

在这里插入图片描述

8.运行至下一个断点处:c(continue)

在这里插入图片描述

9.查看函数调用堆栈:bt

在这里插入图片描述

10.直接运行完当前函数,然后返回到调用地方:finish

在这里插入图片描述

11.临时查看变量或地址的值:p + 变量或地址

在这里插入图片描述

12.监视跟踪查看/取消监视跟踪查看:display/undisplay

在这里插入图片描述

13.跳转到指定行:until+行号

可以利用until来跳出循环
在这里插入图片描述

14.修改变量的值:set var

在这里插入图片描述

15.查看当前栈帧局部变量的值:info locals

在这里插入图片描述
在这里插入图片描述

16.禁用/启用断点:disable/enable 断点编号

在这里插入图片描述


http://www.ppmy.cn/news/7374.html

相关文章

SQL经典练习:电脑商店

表结构 本文使用的表结构如下: 以下是创建表的语句: -- 厂商表 CREATE TABLE Manufacturers (Code INTEGER NOT NULL PRIMARY KEY, -- 编号,主键Name VARCHAR(255) NOT NULL, -- 名称 );-- 产品表 CREATE TABLE Products (Code INTEGER NO…

Java8 Stream详细用法介绍

Java8 Stream详细用法介绍一、Stream概述1.1、流的定义1.2、流与集合1.3、流的特性1.4、Stream的创建1.5、Stream操作分类二、Stream API 使用2.1 中间操作2.1.1、filter() 过滤2.1.2、map与flatMap 映射2.1.3、sorted() 排序2.2 终止操作2.2.1、forEach() 遍历2.2.2、collect(…

Netty面试题大全

Netty面试题大全 目录 文档索引 面试题汇总 Q:Netty是什么?为什么需要Netty? Q:Netty为什么性能高? Q:Netty有哪些组件? Q:Netty如何解决半包读写问题? Q:Netty如…

ESP8266 WIFI模块的使用

ESP8266 wiFI 可以用作连接周边的无线设备,也可以作为发送器供其他设备连接通常在产品中,我们经常用作无线的接收使用,也可能会用作在线升级使用等。 说点题外话:虽然在线升级已经较为成熟,但我不推荐在一些重要的产品…

C# 并行编程

一 并行任务库TPL 1 并行任务库(TPL,Task Parallel Library) 2 最重要的是Task类,还有Parallel类 3 Task类,是利用线程池来进行任务的执行 比如直接用ThreadPool更优化,而且编程更方便 4 Paallel类&…

[01] 两整数之和

371 两整数之和题目给你两个整数 a 和 b ,不使用 运算符 和 - ​​​​​​​,计算并返回两整数之和。题解思路魔鬼细节细节一解析细节二解析细节三解析细节四解析代码循环写法递归写法参考题解题目 给你两个整数 a 和 b ,不使用 运算符 和…

Python爬虫进行正则数据解析实战

今天继续给大家介绍Python爬虫相关知识,本文主要内容是Python爬虫进行正则数据解析实战。 一、需求分析 今天,我们尝试使用re正则表达式来对爬取到的页面进行数据解析。需求如下: 针对网页:https://blog.csdn.net/weixin_402282…

不懂PO 设计模式?这篇实战文带你搞定 PO

1080442 73.1 KB 为UI页面写测试用例时(比如web页面,移动端页面),测试用例会存在大量元素和操作细节。当UI变化时,测试用例也要跟着变化, PageObject 很好的解决了这个问题! 使用UI自动化测试工…