• Linux之gdb调试工具


    请添加图片描述
    最近的状态实在是不好,所以博客停更了一段时间。但是学习是没有停止的,所以这段时间知识又积累了一些。本着做笔记,为这段时间自己的学习进行复习巩固,也希望能解决一些朋友关于这方面知识的疑惑。

    一.复习release和debug

    在学习c语言的时候,我们调用vs2019对程序进行调试的时候,就已经接触到了release和debug版本。
    我们发现:在windows操作系统下,debug版本可调试,是面向程序员的,而release版本代码较debug版本有所优化,占取内存较小,不可调试,是面向用户的。
    Linux下也是如此。

    二.Linux系统下debug版本的调整

    在使用gcc工具的时候,加 **-g**指令即可
    在这里插入图片描述
    并且可以发现,可调试版本的可执行文件比不可调试版本的可执行文件所占据内存的大小要更大
    在这里插入图片描述
    mytest文件是可调试版本的可执行文件
    test文件是不可调试版本的可执行文件


    补充一些关于windows操作系统下的调试快捷键

    F5:调试运行/开始调试,无断点时直接运行程序,有断点时光标停止在第一个断点处。特别地,一直F5会逐断点调试直至程序结束,也就是可以从第一个断点到第二个断点,再从第二个断点到第三个断点,以此类推。
    ctrl+F5:开始执行不调试
    shift+F5:取消调试/停止调试


    三.有关gdb工具的指令详解


    在开始使用gdb工具可能会遇到的问题
    在这里插入图片描述
    如果出现gdb 遇到No symbol table is loaded Use the file command的问题:
    1.没有生成可调试的文件
    命令行:gcc -o 可调试文件的文件名 被编译的.c文件 -g
    2.没有在使用gdb命令后加可调试文件名称


    1.l 查看代码

    在这里插入图片描述
    该命令默认一次只出现10行,如果想要展示全部的代码,按回车继续操作直到代码全部显示完毕。

    2.b 行数 表示在第几行打断点

    在这里插入图片描述

    3.info b 查看断点信息

    在这里插入图片描述

    4.d 对应断点编号 删除指定断点

    删除前查看所有断点的信息
    在这里插入图片描述
    删除某个特点的断点后,查看所有的断点的信息
    在这里插入图片描述

    5.r(run的缩写) 程序运行至光标处停止

    设置三个断点测试该条命令:
    在这里插入图片描述
    a.程序运行到断点四处
    在这里插入图片描述
    显示程序停止到断点四处停止,如果还想再想使得程序重新运行,再执行r命令,则会出现是否重新开始程序的选择。
    b.删除断点四,程序运行停止到断点五。那么,删除断点五,程序运行停止到断点六。
    c.如果删去全部的断点,那么程序直接运行结束。
    简单地将,r的功能是程序开始运行,并且运行到第一个断点处停止。与之配套使用的是continue。

    6.n(next的缩写)逐过程

    这里为了能够更好地显示n的功能,在已有的代码上增加了一个求两数之和的函数。
    在这里插入图片描述
    a.设置一个断点,执行r命令使得程序开始执行到断点处。
    这里为了更好地可以展示效果,就把main函数中的第一行程序设置为断点的行数。
    在这里插入图片描述

    b.当程序执行起来,使用n指令,该指令是逐过程调试,当遇到函数调用时不进入直接跳过。
    在这里插入图片描述

    7.s(step的缩写) 逐语句

    a.设置一个断点,执行r命令使得程序开始执行到断点处。
    这里为了更好地可以展示效果,就把main函数中的第一行程序设置为断点的行数。
    在这里插入图片描述
    b.当程序运行起来,执行s指令,程序便逐语句地一行一行地进行。
    在这里插入图片描述

    8.c(continue的缩写) 一个断点到下一个断点

    在这里插入图片描述
    a.设置全部断点,r开始使得程序运行,并且运行停止于第一个断点处。
    在这里插入图片描述

    b.使用continue,从第一个断点到第二个断点执行程序。
    在这里插入图片描述
    c.继续使用,从第二个断点到第三个断点执行程序。
    在这里插入图片描述
    d.如果程序运行停止到最后一个断点处停止,会出现怎样的效果?
    在这里插入图片描述
    可以看到程序直接运行结束。

    9.finish 直接对应的函数跑完

    finish用于函数跳出返回,英文的含义是在main中,用finish是没有意义的,只有进到子函数里用finish才有意义。
    为了,便于测试该指令的功能,同样还是修改了test.c文件。
    在这里插入图片描述
    a.为了便于调试,直接在调用子函数的那一行设置断点。
    在这里插入图片描述
    b.调用s指令逐行调试,进入到子函数的内部。
    在这里插入图片描述
    c.在子函数内部使用finish指令,直接结束子函数的调用。
    在这里插入图片描述
    d.返回到主函数内部,再使用finish指令,发现不可得。
    在这里插入图片描述

    10.bt 查看函数调用栈帧信息

    在这里插入图片描述

    11.display 变量名 常显示变量名,在程序执行时随时显示变量名

    若是取消 则执行 undisplay 变量名编号

    在这里插入图片描述
    这里要注意的是:设置常变量的时候要跟变量名称,而取消常变量的时候要跟设置常变量的编号。

    12.p 变量名 监视变量值

    在这里插入图片描述
    不难发现,p监视变量值只有在使用p指令的时候显示,而不像常变量那样每一步都会执行。且在p监视变量时要明确跟变量名,如果不跟,那么p指定显示最近刚监视的变量的值。

    13.until 跳转至指定行

    在这里插入图片描述

    14.info locals 查看当前栈帧的局部变量

    为了便于测试,再次修改test.c的内容。
    在这里插入图片描述
    在这里插入图片描述

    15.disable breakpoints 断点编号 关闭断点使能

    enable 打开断点使能

    使能的意思是指该断点是否起效。一般设置断点后均默认其使能,如果要关闭断点的使能就使用disable breakpoints 断点编号此条命令。
    在这里插入图片描述

  • 相关阅读:
    设计模式--总结和对比
    java 对多维数组的工具类(比如遍历多维数组工具类)
    植物大战僵尸变态辅助开发系列教程(E语言实现和VC6实现)(上)
    三分钟带你了解内网穿透的什么
    XAPI项目架构:应对第三方签名认证的设计与调整
    【JavaWeb的从0到1构建知识体系(一)】Java网络编程
    python-(6-1)爬虫---anaconda环境准备
    【JS】模块化的几种解决方案(AMD、CMD、ES6、CommonJS)
    Java面试集锦-共计2题
    为什么会突然牙疼?
  • 原文地址:https://blog.csdn.net/shizhongruyi0606/article/details/127588081