Linux调试器之gdb

这篇具有很好参考价值的文章主要介绍了Linux调试器之gdb。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

我们前面介绍了几个基本的环境开发工具。例如通过yum我们可以安装和卸载软件、通过vim我们可以写代码、通过gcc和g++我们可以编译代码成可执行程序。但是如何在Linux下调试代码呢?我们并未介绍,本期我们将来介绍最后一个工具 --- 调试器gdb。

本期内容介绍

程序的发布方式

gdb基本的调试操作

程序的发布方式

程序的发布方式有两种:debug模式 和 release模式

gebug模式:编译的程序通常包含了额外的调试信息目的是为了方便后期维护人员的维护!在debug模式下,编译器的优化力度较小,更多的保留了原生代码的结构和信息。支持调试且通常运行速较慢!

release模式:编译的程序通常会进行各种优化,原生代码和结构会很少,目的是为了让使用者有更好的体验!在release模式下,不会添加额外的调试信息,所以在release上一般不支持调试但通常运行速度较快!

总结:debug包含调试信息,可调试但运行速度慢。release不包含调试信息但运行速度快!

这个其实我们不陌生,在VS上我们已经见过了:

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

Linux下的gcc/g++默认编译采用的是release模式!要让gcc/g++编译采用debug模式,需要加-g选项!!!

OK,我们来拿个栗子测试一下两者的区别:

#include <stdio.h>

int add_sum(int src, int dest)
{
    int ret = 0;
    for(int i = src; i <= dest; i++)
    {
        ret += i;
    }
    
    return ret;
}

int main()
{
    printf("begin...\n");
    int src = 1;
    int dest = 100;

    int result = add_sum(src, dest);

    printf("result = %d\n", result);

    printf("end....\n");
    return 0;
}

我们先来写一个makfile:

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

我们可以的看到debug比release的要大!!原因就是debug加了调试信息!

我们也可以看看到底添加了那些东西:

readelf -S process-debug | grep -i debug

我们可以通过这条指令进行查看到底添加了什么,先看现象再解释这条指令是啥意思:

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

以上这就是添加的调试信息!!OK介绍一下这条指令的意思!

什么是ELF?

ELF是一种灵活的存储格式,允许数据和代码以及其他的必要信息各种不同的段并支持动态链接和加载,一般用于存储可执行文件、目标文件、共享库标准文件等。在Linux系统中被广泛的使用,这个的可执行文件就是按着这个格式存储的!

所以这里的readelf  -S process-debug是在读取process这个可执行程序的信息。后面加一个管道过滤在提取gebug的信息,-i是忽略大小写~

OK,我们上面说过release是没有添加调试信息的,我们可以来验证:

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

gdb基本的调试操作

启动调试:gdb binfile(二进制文件,就是可执行程序)

类似于VS中的F5

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

启动后命令行解释器就变成了(gdb)!!

退出gdb:quit / q

类似于VS中的shift + F5

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

list / l 文件名:行号或函数:依次显示从行号开始的源代码或某个函数的源代码,每次显示10行

我们这个只有一个文件直接可以这样: list / l :行号或函数

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

gdb是会记住最近指令的一条指令

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

r运行程序 

会直接运行完整个程序

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

但是我们这样我们也无法进行调试啊~!所以我们得设断点!

break/b 文件名:行号  ,在某一行设置断点

break/b 函数名,在某个函数的开头设置断点

只有一个文件可以直接break/b 行号/函数名

类似于VS的F9

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

这里断点打在行上是没有问题的,但是在函数名上为什么就不在函数名的哪一行呢??这里就需要谈谈函数了。函数实质上就是一个代码块,它的函数名我们在C语言介绍过是指针!函数名更多的作用是记录这个函数的位置方面调用的时候调到!真正的代码是在函数体内的!所以他函数名在14行断点在16行的原因!

我们知道在VS上当程序运行到断点处时会停下来,我们这里也可以验证:

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

果然在三号断点处停了下来,这里也就是main函数!其他没有执行的原因是main是程序的入口,在main这里就停了其他的也就未执行!OK,断点打好了如何查看呢?VS上好得可以看到有一个红点,这里如何查看?

查看断点信息:info break(b)

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

这里就看到了断点的信息,左边有他们独有的编号,而且这个编号是线性增长的!比如你现在把1号断点去掉,后面的也不会变化还是2和3, 1不会被占!OK这就得取消断点验证!

删除断点编号为n的断点:delete(d) n(断点编号)

删除断点全部断点:delete(d) breakpoints

OK先来把上面断点编号的介绍给验证了!

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

注意这里是d + 断点编号,否则可能会误操作或根本就没有这个断点编号:

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

删除全部断点:

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

使能(关闭和启用)断点:disable/enable 断点编号

OK,这个东西其实在VS也是见过的:

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

这里我打了三个断点,假设我现在暂时不让第一个起作用了,我们可以把这个断点禁用了:

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

把鼠标放到这个断点处,右键有个禁用,点击就把这个断点禁用了!它的红点就变黑了即关闭了:

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

同样Linux上如何做了?OK,就是disable和enable!这里我们当前的断点一个在另一个函数暂时不管:这里重新搞两个断点:

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

此时一个在16行一个在20行,如果16行的断点在的话会在执行r指令后停在16行:

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

如果我们现在不想要了,可以把这个断点给禁掉,再来看看效果:

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

此时他的使能显示为n,就是禁掉了!此时r就会在20行停下:

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

如果我现在又想要启动这个断点了,直接enable 断点编号!

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

类似于VS:

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

逐过程:next/n 
类似于VSF10

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

这就是一步一步的走的!我们也看到了在20行函数调用的时候他没进去!

逐语句:step/s

类似于VS的F11

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

很明显是逐语句走的在20行的时候进行入了add_sum函数!!!OK现在可以住语句和逐过程调试了但是上面发面我们虽然进入了函数但是咋查看每个变量的值啊?我们在VS上平时调试的时候可是可以看的!OK我们来继续介绍如何查看。

查看变量var的内容(或地址):print/p  var / p &var

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

但是还是有问题:

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

我们发现刚刚只是显示了那一次的变量的内容信息,后面的就不显示了,这不太挫了!每一次都得我手动显示?是不是不太好?所以我么来介绍常显示。

常显示变量var的内容(或地址):display var /diaplay &var

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

这样这些我们想要的变量信息就可以被常显示了!!!如果此时我不想要某常显示的变量了,我们该如何取消呢?

取消常显示的变量信息:undisable 编号

我们上面看到了每个常看见的变量信息是有一个独立的编号的:

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

我们如果不想要某个常显示的信息了,直接undisable 编号即可!

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

从当前断点跳到下一个断点:continue/ c

我们在VS上也很常用:例如我们在VS上:

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

我们当前在这个断点处,当前这块我已经检查没有错误,想到下一个断点,我们是直接F5:

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

Linux上是如何怎么做的呢?操作和VS的难度一样就一条指令:continue:

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

当前有两个断点,我们开始运行是到第一个停下,我们想到第二个断点只能s或n,这样太慢了。我们直接想到第二个断点:

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

运行结束当前函数就停下:finish

这里可能就有伙伴不理解为什么有这个指令呢?OK,给个场景:假设你的代码很长,里面调用了很多函数,你不知道是那个函数出问题了,你就得一个函数一个函数的找。此时你只需要走完这个函数对比预期的结果看看是否符合即可做出下一步决策!此时就有了这条指令的优势。

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

跳到指定行n(中间的代码都运行了):until n

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

查看当前函数栈帧局部变量的值:info(i) locals

类似于VS的监视窗口的局部变量

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

修改变量的值:set var 

假设在一个循环中,你不知道i在某一个值的时候木不符合,此时你就可以给i设置一个值判断了!

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

查看函数以及参数:bt(breaktrace)

Linux调试器之gdb,Linux从入门到进阶,linux,服务器

OK,好兄弟本期分享就到这里,我们下期再见~!

结束语:奋斗不息,成功将至!文章来源地址https://www.toymoban.com/news/detail-853475.html

到了这里,关于Linux调试器之gdb的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • [Linux] Linux代码调试器 -- gdb

    [Linux] Linux代码调试器 -- gdb

    1、程序的发布方式有两种,debug模式和release模式 2、Linux gcc/g++出来的二进制程序,默认是release模式 3、要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项 我们先来写一段C语言代码: 这里我们正常再编写一个Makefile文件,用于自动化构建,我们要还是正常的编

    2024年02月05日
    浏览(16)
  • Linux调试器之gdb

    Linux调试器之gdb

    我们前面介绍了几个基本的环境开发工具。例如通过yum我们可以安装和卸载软件、通过vim我们可以写代码、通过gcc和g++我们可以编译代码成可执行程序。但是如何在Linux下调试代码呢?我们并未介绍,本期我们将来介绍最后一个工具 --- 调试器gdb。 程序的发布方式 gdb基本的调

    2024年04月16日
    浏览(13)
  • Linux - 还不懂 gdb 调试器?(调试软件)

    Linux - 还不懂 gdb 调试器?(调试软件)

    当前,我们可以使用 make/makefile 来程序化执行代码文件;可以使用 gcc/g++ 等编译器来编译代码;可以使用 vim 编辑器来编写代码;其实在 Linux 当中还有一个工具,可以实现调试工作,这个工具就是 -- gdb。 在了解调试器之前,你应该对代码的发布版本做一些了解: 我们在 VS

    2024年02月07日
    浏览(9)
  • 【Linux】——调试器-gdb的使用

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

    序言: 本期,我将带领大家学习的关于linux下的 调试器gdb 的使用,废话不多说跟着我一起去看看吧!! 目录 前言 (一)背景介绍 1、debug模式和release模式 2、为什么Release不能调试但DeBug可以调试 3、初步见识 1️⃣readelf (二)调试代码 1、命名大全 2、具体演示 0️⃣行号显

    2024年02月07日
    浏览(15)
  • 【Linux】gdb调试器的使用

    【Linux】gdb调试器的使用

    文章目录 一、gdb简介 二、调试前的准备 1、生成调试文件 2、启动 gdb  三、gdb 使用方法  1、查看源代码 2、设置 / 查看断点(多种方式设置断点) 方法一 方法二 方法三 3、run  4、删除断点、断点无效 5、逐过程调试(以函数为单位) 6、逐语句调试 7、查看调用链 8、查看变

    2024年02月02日
    浏览(15)
  • 【Linux】Linux下调试器gdb的使用

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

    👑作者主页:@安 度 因 🏠学习社区:StackFrame 📖专栏链接:Linux 如果无聊的话,就来逛逛 我的博客栈

    2024年02月19日
    浏览(17)
  • 【Linux】调试器:gdb 的基本使用

    gdb 全称 GNU symbolic debugger,是 Linux 下常用的程序调试器。 调试器的核心工作,主要是为了定位问题。废话不多说。 gdb 的安装 另外: gcc、g++ 默认形成的版本是 release,不是 debug 版本!所以想要在 Linux 下调试程序,需要在 Makefile 文件 中,添加 -g 选项 指定以 dubug 方式编译程

    2024年02月16日
    浏览(16)
  • Linux | 调试器GDB的详细教程【纯命令行调试】

    Linux | 调试器GDB的详细教程【纯命令行调试】

    学习了【vim】知道了如何 编辑 一个代码文本 学习了【gcc】知道了如何 编译 一个代码文本 学习了【make/Makefile】知道了如何 自动化构建 一个代码文本 但是如何对一段代码去进行调试呢,此时就要使用到 Linux下的调试器gdb 了。对于这个调试器来说,不像是VS中那样的图形化界

    2024年02月02日
    浏览(17)
  • Linux开发工具之调试器gdb

    程序的发布方式有两种,debug模式和release模式 Linux gcc/g++出来的二进制程序,默认是release模式 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项   所以一份代码若要被调试必须是debug模式,但是在linux下我们编译代码的时候默认为release模式,要想让我们的代码

    2024年02月07日
    浏览(15)
  • Linux:gdb调试器的解析+使用(超详细版)

    Linux:gdb调试器的解析+使用(超详细版)

    程序的发布方式有两种,debug模式和release模式 debug模式:可以被调试; release模式:不可以被调试。 为什么需要debuy和release这两个模式呢? 答:程序员在开发的时候需要去调试代码,所以需要debuy模式,而用户一般不懂这些代码的调试不需要debuy模式,只需要快速的下载和安

    2024年02月05日
    浏览(15)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包