『Linux』GDB调试

前言

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.hqwc.cn/news/132360.html

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

相关文章

【LeetCode力扣】75 快速排序的子过程partition(荷兰国旗问题)

目录 1、题目介绍 2、解题思路 2.1、冒泡排序暴力破解 2.2、快速排序的子过程partition 2.2.1、详细过程描述 2.2.2、代码描述 1、题目介绍 原题链接&#xff1a;75. 颜色分类 - 力扣&#xff08;LeetCode&#xff09; 示例 1&#xff1a; 输入&#xff1a;nums [2,0,2…

电脑出现msvcr120.dll文件缺少怎么办-缺少msvcr120.dll文件修复方法

电脑出现 msvcr120.dll 丢失的情况&#xff0c;通常是由于系统文件损坏、软件冲突、病毒感染等原因引起的。为了解决这个问题&#xff0c;这里提供了 6 种修复方法&#xff0c;以及关于 msvcr120.dll 文件的详细介绍和丢失原因。 6 种修复方法&#xff1a;第一&#xff1a;利用…

JVM面试题:(三)GC和垃圾回收算法

GC: 垃圾回收算法&#xff1a; GC最基础的算法有三种&#xff1a; 标记 -清除算法、复制算法、标记-压缩算法&#xff0c;我们常用的垃圾回收器一般 都采用分代收集算法。 标记 -清除算法&#xff0c;“标记-清除”&#xff08;Mark-Sweep&#xff09;算法&#xff0c;如它的…

SAP内部转移价格(利润中心转移价格)的条件

SAP内部转移价格&#xff08;利润中心转移价格&#xff09; SAP内部转移价格&#xff08;利润中心转移价格&#xff09; SAP内部转移价格&#xff08;利润中心转移价格&#xff09;这个听了很多人说过&#xff0c;但是利润中心转移定价需要具备什么条件。没有找到具体的文档。…

你知道多号发圈的同时并延迟评论的方式吗?

你知道多号发圈的同时并延迟评论的方式吗&#xff1f; 其实很简单。 步骤1&#xff1a;编辑好朋友圈内容 步骤2&#xff1a;设置延迟评论 步骤3&#xff1a;选择多个号发圈 通过以上3个步骤&#xff0c;就可以实现多号发圈的同时并延迟评论。 在发布朋友圈前&#xff0c;只需要…

产品经理需要掌握哪些产品专业知识?

作为产品经理&#xff0c;最重要的是洞察客户的需求、理解客户的需求、掌握客户的需求&#xff0c;所以&#xff0c;第一件事情就是要有清晰的战略方向&#xff0c;我们到底梦想是什么&#xff1f;要做什么&#xff1f;能做什么&#xff1f;在哪儿做&#xff1f;谁负责去做&…

软件工程与计算总结(七)需求文档化与验证

目录 一.文档化的原因 二.需求文档基础 1.需求文档的交流对象 2.用例文档 3.软件需求规格说明文档 三.需求文档化要点 1.技术文档协作要点 2.需求书写要点 3.软件需求规格说明文档属性要点 四.评审软件需求规格说明文档 1.需求验证与确认 2.评审需求的注意事项 五…

Jmeter之Bean shell使用详解

一、什么是Bean Shell BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法;BeanShell是一种松散类型的脚本语言(这点和JS类似); BeanShell是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,具有对象脚本语言特性,非常精…

【Linux】https协议

文章目录 &#x1f4d6; 前言1. 引入https协议2. 常见的加密方式2.1 对称加密&#xff1a;2.2 非对称加密&#xff1a;2.3 数据摘要&&数据指纹&#xff1a; 3. 对加密方式的探究3.1 只使用对称加密&#xff1a;3.2 只使用非对称加密&#xff1a;3.3 双方都使用非对称加…

gogs和drone如何配合使用

上篇介绍了drone和gogs安装方法&#xff0c;这次介绍这两个如何使用&#xff0c;此篇文章主要介绍在物理机上进行发布。 此处用到的java项目地址&#xff1a;https://gitee.com/huningfei/demo-test 一 配置gogs 1.1 在Gogs中配置指定仓库的”.drone.yml“文件 1.2 ssh-drone…

Spring Task 快速入门

哈喽~大家好&#xff0c;这篇来看看Spring Task 快速入门。 &#x1f947;个人主页&#xff1a;个人主页​​​​​ &#x1f948; 系列专栏&#xff1a;【日常学习上的分享】 &#x1f949;与这篇相关的文章&#xff1a; Redis…

c++视觉处理 ------ 反向投影图和直方图的变化

通道混合&#xff1a;cv::mixChannels cv::mixChannels 是 OpenCV 中的一个函数&#xff0c;用于执行通道混合或通道分离操作。通常情况下&#xff0c;这个函数用于处理多通道图像&#xff0c;允许你从多通道图像中提取或重新排列通道&#xff0c;或者将不同通道的数据组合到一…