• Linux代码调试----gdb使用介绍


    目录

    一、简介

    二、gdb使用流程:

     (1)gdb的启动

     (2)调试中查看源代码

    (3)开始调试


    一、简介

    GDB 全称“GNU symbolic debugger”,是 Linux 下常用的程序调试器。发展至今,GDB 已经迭代了诸多个版本,当下的 GDB 支持调试多种编程语言编写的程序,包括 C、C++、Go、Objective-C、OpenCL、Ada 等。实际场景中,GDB 更常用来调试 C 和 C++ 程序。所以对于一名Linux下工作的c/c++程序员,对gdb的了解是必不可少的。

    二、gdb使用流程:

    首先,我们现在Linux下写一个简单的c程序:

     

     然后通过 gcc code.c -o test -g   编译该程序,-g使该编译后的文件是debug的,可以进行调试,不然默认情况下,gcc编译的文件是release的,无法进行调试。

     (1)gdb的启动

    指令:

    gdb +被调试文件的文件名      #进入调试

    quit         #退出调试

    输入gdb test 就可以直接对我们之前编译后的test文件进行调试,如果想退出调试,输入quit。 

     (2)调试中查看源代码

    指令:

    list 或 l 0      # 注意l是小写的“L”。Gdb会记录最近一次命令,所以输入一次后可以直接回车

                            继续显示,执行一次显示10行,显示完所有代码后会有提示。

    (3)开始调试

    指令:

    r     #开始调试该代码,如果每有打断点会直接运行结束

     

     在没有打断点,调试程序就会直接从头到尾运行,所以,打断点就需要用到:

    指令:

    b+行号      #对代码中的某行打断点

    info + b    #查看我们所打的断点位置

    打断点并调试: 

     

     查看断点:

     当我们运行到断点位置后,想要像在编译器上调试一样,进行逐语句、逐过程进行调试,可以用:

    指令:

    n           #逐过程调试,相当于F10

    s           #逐语句调试,相当于F11

     

    我这里后面没有新写函数,所以n和s都是一句一句的调用了,但n和s的使用是没问题的。 

    如果我们想查看调试过程中的变量的值的变化,我们可以用:

    指令:

     p + 变量名      #在调试的过程中显示该变量的变化

     新写了一段简单代码来举例:

    这样是不是很麻烦呢,可不可以让他一直显示呢?当然是可以啦,我们这时需要用到:

    指令:

    display + 变量名      #随着调试的进行常显示该变量。

    undisplay + 编号      #取消该编号对应的变量常显示。 

     注意:取消常显示是的指令对象是编号不是变量名。编号就是每一次变量显示值前面的那个数

    在调试的过程中,如果有多个断点,我们运行到一个断点后,想要运行到下一个断点,可以用:

    指令

    c       #运行到下一断点处 

      

     如果我们想要删除某个断点,可以用:

    指令:

    d  + 编号      #编号是我们在info指令下查看的断点编号。

     这里删除的断点编号,不能是我们打断点的行号,不然会删除失败或删错:

    (4)线程相关的调试

    $  info threads                 // 显示当前程序处于哪一个线程中

     $ t 线程id   // 切换到指定线程执行

    $ set scheduler-locking on   // 锁定, 在当前线程下执行,不会被其他线程抢占CPU,直到该线程运行完成。

    $ disassemble          // 解析汇编指令, 显示当前接下来要执行的汇编指令

    $ ni                // 执行汇编下一条汇编指令

     如果对你有用就支持一下吧,如果有什么问题,欢迎提出来哦。谢谢阅读!!!

  • 相关阅读:
    Day726.Java平台模块系统 -Java8后最重要新特性
    JavaScript动画库:Anime.js
    Vue的mixin(混入)
    本人开发Android视频编码和直播推流使用到的相关命令
    栈溢出漏洞
    Spring源码之invokeBeanFactoryPostProcessors扫描、BeanDefinition生成
    柯桥英语培训,商务英语学习,常用口语
    联想ThinkSystem服务器 安装ESXI 7.0 踩坑记录
    多模态论文阅读--V*指导视觉搜索成为多模态大语言模型的核心机制
    基于Python的数据科学(7):Pandas基础
  • 原文地址:https://blog.csdn.net/qzt__l0ve/article/details/128046124