『Linux』GDB调试

news2024/9/25 17:16:05

前言

GDB 是由 GNU 软件系统社区提供的调试工具,同 GCC 配套组成了一套完整的开发环境,GDB 是 Linux 和许多类 Unix 系统中的标准开发环境。
一般来说,GDB 主要完成下面四个方面的功能:
启动程序:可以按照自定义的要求随心所欲的运行程序。
设置断点:可让被调试的程序在所指定的调置的断点处停住,断点可以是条件表达式。
打印信息:当程序被停住时,可以检查此时程序中所发生的事。
修改变量:可以通过修改程序中的变量,将一个 BUG 产生的影响修正从而测试其他 BUG。

debug版本与release版本

  • 假设存在一段代码:

    //文件为 gdb_test.cpp
    #include<iostream>
    
    int GetSum(int n){ //主要是测试 ;其功能为计算1至n之和;
      int ret = 0;
      for(int i = 1;i<=n;++i){
        ret+=i;
      }
       return ret;
     }
     
     int main()
     {
       int n =0;
       std::cin>>n;
      
        int ret = GetSum(n);
        std::cout<<ret<<std::endl;
        return 0;                                                         
      }
    

    再使用g++进行编译:

    g++ gdb_test.cpp -o test 
    

    编译链接过后进行运行确保程序无误;

    在这时若是想使用gdb进行调试:

    gdb test
    

    (前提是得有gdb),若是没有gdb则需要使用yum进行安装:

    sudo yum install -y gdb
    

    将会出现这样的提示:

    (no debugging symbols found) … done.

    没有找到调试符号

    这正是因为,在使用gcc/g++进行编译链接所生成的可执行文件默认是release版本的,无法进行debug调试;

    这里可以再回顾一下gcc/g++的特性;

    链接生成的可执行程序
    gcc/g++在不使用-static修饰的时候默认为动态链接;默认生成的可执行程序的版本为release版本,若是需要生成debug版本需要在末尾处加上-g

生成debug版本的可执行程序:

g++ gdb_test.cpp -o test_debug -g 

添加-g选项代表该可执行程序为以debug方式发布的

生成debug版本的可执行程序后即可以进行调试;

gdb test_debug

在此之前可以使用readelf来查看ELF格式文件信息;

readelf -S 'filename' #使用-S选项显示节头信息

或者

readelf -S 'filename' | grep -i debug  #使用-S选项显示节头信息,grep debug为找出所有带debug的信息,-i为不区分大小写;

以第二条命令查看release版本的可执行程序的段信息时可以看到

由于没有debug,所以不显示;同时因为没有debug也不能进行调试;

同时使用第二条命令对所生成的debug版本的可执行程序时为


debug版本和release版本的大小差是因为在debug版本中多出了许多调试信息

在进行调试之前先使用Makefile以方便构造与清除


GDB操作

启动与退出gdb

gdb 'filename' #使用该命令即可启动gdb调试,其中filename为可执行程序(debug版)
quit #要退出gdb时只要输入quit或者q即可退出

显示代码

list #当然大多数情况下会使用简写 l ,从头开始即为 l 0 并回车至所有代码显示完毕

一般使用list时,gdb将会按照自己的方式将代码进行显示,可能不显示全,单若是希望从头开始显示时则可以使用 l 0 即从头显示代码,单此时也并不会显示完全,所以要用回车至所有代码显示完全;

同时在这里该注意,gdb与平时的Linux操作中较为不同的是;

在gdb调试过程中,gdb将会记住你上次的指令,这也是在使用list(或者l)后按照回车能够继续显示代码,在此处按回车时将会继续list的命令;


控制程序执行

命令功能
run < arguments > 或者 r < arguments >运行或者重新运行程序,并传递指定的参数。如果设置了断点,程序会在断点处暂停,并显示当前的源代码和寄存器值;
如 : run arg1 arg2运行程序,并传递arg1和arg2为参数;
continue 或者 c继续运行程序 (若是有断点则至下一个断点处停止,否则运行至程序结束)
next 或者 n逐过程调试(不进入函数)
step 或者 s逐行调试 (会进入函数)
finish 或者 f执行程序至当前函数结束(返回),并显示返回值;
return < expression >或者 r < expression >强制当前函数立即返回,并将返回值设定为指定的表达式。如果不指定表达式则返回0;
jump < location >或者 j < location >强制程序跳转到指定位置,可以是行号、或者是地址;将可能改变程序的正常流程;

断点设置与取消:

命令功能
(gdb) break main(main的这个位置可以是函数名、文件名: 、行号或者内存地址)在main函数的第1行的位置设置断点(以此类推,所有的函数都可以像这样进行断点设置)
(gdb) break test.c:10 在同一目录下的test.c源文件设置断点(暂未证实,应该另有)
(gdb) info breakpoints 查看当前节点个数以及编号位置等信息;可以简写为i b 以此类推,但是此处的breakpoints并不能用来进行断点(不能使用breakpoints 10 这类的方式进行断点)
(gdb) delete 1 删除编号为1 的节点 ;delete也可以简写为d;
(gdb) delete 删除所有节点
condition <number编号> <expression表达式>或者cond <number编号> <expression表达式> 给指定编号的断点添加条件,当条件为真时,起到断点作用

查看(或修改)变量、寄存器与内存

命令功能
print 或者 p 打印某个变量或者表达式的值。可以使用任何合法的C语言表达式,包括宏、指针、结构体等。
print x 打印变量x的值
print *p打印指针p所指向的值
print add(10,20);打印调用add函数并传入10 20作为参数后的返回值;
set < expression>修改某个变量或者表达式的值,修改规则同上;
set x = 10 将变量x修改为10,同理该方法也同样可以用来修改指针
set add(10,20) = 100 修改调用函数并传递10与20作为参数后修改返回值为100
info registers或者i f显示所有寄存器的值
info registers < name >或者i f 显示指定的寄存器的值
info registers eax 显示eax寄存器的值
set $< name > = < value >修改寄存器的值
set $eax = 5 将寄存器eax 的值修改为5

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

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

相关文章

Unity布料系统Cloth

Unity布料系统Cloth 介绍布料系统Cloth(Unity组件)组件上的一些属性布料系统的使用布料约束Select面板Paint面板Gradient Tool面板 布料碰撞布料碰撞碰撞适用 介绍 布料系统我第一次用是做人物的裙摆自然飘动&#xff0c;当时我用的是UnityChan这个unity官方自带的插件做的裙摆…

【计算机网络笔记】什么是网路协议?

为什么要有网路协议&#xff1f;什么是网络协议&#xff1f;总结感谢 &#x1f496; 本篇文章总字数&#xff1a;1027字 预计阅读时间&#xff1a;3~7min 建议收藏之后慢慢阅读 为什么要有网路协议&#xff1f; 硬件&#xff08;主机、路由器、通信链 路等&#xff09;只是计…

FPGA project : flash_erasure

SPI是什么&#xff1a; SPI&#xff08;Serial Peripheral Interface&#xff0c;串行外围设备接口&#xff09;通讯协议&#xff0c;是Motorola公司提出的一种同步串行接口技术&#xff0c;是一种高速、全双工、同步通信总线&#xff0c;在芯片中只占用四根管脚用来控制及数据…

k8s使用

一、Kubernetes好处 ​ kubernetes&#xff0c;是一个全新的基于容器技术的分布式架构领先方案&#xff0c;是谷歌严格保密十几年的秘密武器----Borg系统的一个开源版本&#xff0c;于2014年9月发布第一个版本&#xff0c;2015年7月发布第一个正式版本。 ​ kubernetes的本质…

docker 安装oracle

拉取镜像 拉取oracle_11g镜像 拉取oracle镜像(oracle 11.0.2 64bit 企业版 实例名: helowin) Oracle主要在Docker基础上安装&#xff0c;安装环境注意空间和内存&#xff0c;Oracle是一个非常庞大的一个软件&#xff0c; 建议使用网易镜像或阿里镜像网站这里以oracle 11.0.2…

XPath在数据采集中的应用:从XML和HTML中提取数据

目录 一、XPath简介 二、XPath的语法 三、XPath在数据采集中的应用 四、XPath和其他数据格式 总结 在当今的数据驱动时代&#xff0c;从各种数据源中提取有用的信息变得至关重要。其中&#xff0c;XML和HTML作为主流的数据源格式&#xff0c;常常出现在我们的数据提取任务…

PHP Discord获取频道消息功能实现

PHP Discord获取频道消息功能实现 1. 关注对应频道2. 添加机器人3. 配置机器人权限4. 使用 DiscordPHP 类库5. 代码示例 (Laravel 框架)6. 服务器部署 1. 关注对应频道 首先要创建自己的频道, 然后到对应的公告频道中关注这个频道(这时 Discord 会让你选择频道, 选择之前创建的…

集成内部高端电源开关LTC3637HMSE、LTC3637MPMSE稳压器,TJA1443AT汽车CAN FD收发器。

一、LTC3637 76V、1A 降压型稳压器 &#xff08;简介&#xff09;LTC3637是一款高效率降压DC/DC稳压器&#xff0c;集成内部高端电源开关&#xff0c;功耗仅12μA DC&#xff0c;空载时可保持稳定的输出电压。LTC3637可提供高达1A的负载电流&#xff0c;并具有可编程峰值电流限…

虹科分享 | 想买车无忧?AR为您带来全新体验!

新能源汽车的蓬勃发展&#xff0c;推动着汽车行业加速进行数字化变革。据数据显示&#xff0c;全球新能源汽车销售额持续上升&#xff0c;预计到2025年&#xff0c;新能源汽车市场规模将达到约 4200亿美元&#xff0c;年复合增长率超过 30%。这表明消费者对清洁能源出行的需求不…

3.Javaweb模块进阶

1.2web进阶 什么是 CSRF 攻击&#xff0c;如何避免&#xff1f; CSRF&#xff1a;Cross-Site Request Forgery&#xff08;中文&#xff1a;跨站请求伪造&#xff09;&#xff0c;可以理解为攻击者盗用了你的身份&#xff0c;以你的名义发送恶意请求&#xff0c;比如&#x…

SIP对讲求助终端sip解码广播终端

SIP对讲求助终端sip解码广播终端 SV-2701VP具有10/100M以太网接口&#xff0c;支持最高48KHz采样&#xff0c;192Kbps的音频流播放。接入12V/1A的直流电源。具有1路mic输入&#xff0c;1路线路输入&#xff0c;1路立体音线路输入&#xff0c;这3组信号经过信号混合后输出到本地…

计算机毕业设计选什么题目好?springboot 社区流浪动物救助领养系统

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

Websocket获取B站直播间弹幕教程——第二篇、解包/拆包

教程一、Websocket获取B站直播间弹幕教程 — 哔哩哔哩直播开放平台 1、封包 我们连接上B站Websocket成功后&#xff0c;要做两件事情&#xff1a; 第一、发送鉴权包。第二、发送心跳包&#xff0c;每30秒一次&#xff0c;维持websocket连接。 这两个包不是直接发送过去&…

PowerShell pnpm : 无法加载文件 C:\Users\lenovo\AppData\Roaming\npm\pnpm.ps1

1、右键点击【开始】&#xff0c;打开Windows PowerShell&#xff08;管理员&#xff09; 2、运行命令set-ExecutionPolicy RemoteSigned 3、根据提示&#xff0c;输入A,回车 此时管理员权限已经可以运行pnpm 如果vsCode还报该错误 继续输入 4、右键点击【开始】&#xff0c;打…

如何将gif变成视频?3个转换方法

如何将gif变成视频&#xff1f;没错&#xff0c;GIF是一种动态图片格式&#xff0c;与视频在本质上有所区别。在一些自媒体平台上&#xff0c;我们无法直接分享GIF格式的图片&#xff0c;但可以将其转换为视频格式后再进行分享。因此&#xff0c;当我们想要分享我们喜欢的GIF图…

C# 文件监听FileSystemWatcher

用处 当文件修改后&#xff0c;触发其他操作&#xff0c;例如删除另一个文件夹下的文件等 代码 using System; using System.Collections.Generic; using System.Diagnostics; using System.IO;namespace ConsoleApp6FileSystemWatcher {internal class Program{static void …

【TES720D-KIT】基于复旦微FMQL20S400全国产化ARM开发套件(核心板+底板)

TES720D-KIT是专门针对我司TES720D&#xff08;基于复旦微FMQL20S400的全国产化ARM核心板&#xff09;的一套开发套件&#xff0c;它包含1个TES720D核心板&#xff0c;加上一个TES720D-EXT扩展底板。 FMQL20S400是复旦微电子研制的全可编程融合芯片&#xff0c;在单芯片内集成…

微信小程序在TS模板下引入TDesign组件

介绍 TDesign 是腾讯官方出品的一款微信小程序组件库。本文介绍如何在新建ts空白模板下引入TDesign库 步骤 新建一个空白项目&#xff0c;这里可以选择TS-基础模板 新建项目目录结构如图所示&#xff1a; 注意这里其实小程序的文件都存放在miniprogram文件夹下&#xff0c;…

本文整理了Debian 11在国内的几个软件源。

1&#xff0e;使用说明 一般情况下&#xff0c;将/etc/apt/sources.list文件中Debian默认的软件仓库地址和安全更新仓库地址修改为国内的镜像地址即可&#xff0c;比如将deb.debian.org和security.debian.org改为mirrors.xxx.com&#xff0c;并使用https访问&#xff0c;可使用…

关于神经网络的思考

关于感知机 感知机&#xff08;Perceptron&#xff09;和神经网络&#xff08;Neural Network&#xff09;之间有一定的关系&#xff0c;可以说感知机是神经网络的一个基本组成单元。 感知机&#xff1a; 感知机是一种简单的二分类线性分类器。它接受多个输入&#xff0c;对每…