当前位置: 首页 > article >正文

linux基础:4:gdb的使用

gdb的使用:

  • 一.jdb的使用:
    • 1.引入:
    • 2.在linux下生成可执行程序:
    • 3.代码+调试(开始使用)
      • 1.等待调试的源代码:
      • 2.vim 配置Makefile/makefile 文件
      • 3.进入操作:
        • 1.进入调试模式:
        • 2.显示代码:
        • 3.运行代码:
        • 4.断点:
        • 5.使能断点:
        • 6.进入函数:
        • 7.显示变量的值和地址:
        • 8.查看当前函数栈帧信息:
        • 9.多步跳跃:
        • 10.调整变量的值:

一.jdb的使用:

1.引入:

1.程序有两种发布方式,dubug 模式 和 release 模式:
2.dubug 模式有较多的调试信息,release模式下没有那么多的调试信息:
3.dubug模式是给程序员使用的用来观察错误和解决错误的一个方法,程序的本身比较大的。
4.release 模式是给用户使用的没有调试信息,程序的大小是比dubug模式生成的程序要小,比较方便用户的下载和使用。

2.在linux下生成可执行程序:

1.学习完make和Makefile之后我们就通过配置Makefile文件使用make命令进行快速生成可执行程序。
2.我们要在Makefile文件中生成可执行程序后面 加上一个-g选项 这样才会生成debug版本的?
3.因为linux下 gcc 或者 g++ 是默认生成release版本的可执行程序。

3.代码+调试(开始使用)

1.等待调试的源代码:

在这里插入图片描述

#include<iostream>
#include<assert.h>

using namespace std;

template<class T>
class Stack{
public:
    //1.构造
    Stack(int n=10)
        :arr(new T[n])
        ,_top(0)
        ,_capacity(n)
    {
        ;
    }

    //0.判断栈是否为空:
    bool _Empty()    {
        assert(arr!=nullptr);
        if(_top==0)
        {
            return true;
        }
        else{return false;}
    }
    //1.入:
    void push(T x)
    {
        assert(arr!=nullptr);

        if(_top == _capacity)
        {
            _capacity*=2;
            arr = (T*)realloc(arr,sizeof(T)*(_capacity));
            cout<<"扩容成功"<<endl;
        }
        else
        {
            arr[_top++]=x;
        }
    }
    
    //2.出:
    void pop()
    {
        assert(arr!=nullptr);
        if(!_Empty())
        {
            arr[_top]=0;
            _top--;
        }
        else
        {
            cout<<"没有数据可以去除了"<<endl;
        }
    }

    //3.获取栈顶数据
    T top()
    {
        assert(arr!=nullptr);

        if(!_Empty())
        {
            return arr[_top];
        }
        else 
        {
            return -1;
        }
    }

    //4.获取栈中数据个数:
    int num()
    {
        assert(arr!=nullptr);
        return _top;
    }

    void print()
    {
        assert(arr!=nullptr);

        for(int i=0;i<_top;i++)
        {
            cout<<arr[i]<<"--";
        }
        cout<<"\n";
    }

    ~Stack()
    {
        delete[] arr;
        _top = 0;
        _capacity = 0;
    }

private:
    T* arr;
    int _top;
    int _capacity;
};

int main()
{
    Stack<int> s1(2);

    s1.push(1);
    s1.push(2);
    s1.push(3);
    s1.push(4);
    s1.push(5);
    s1.push(6);

    s1.print();

    s1.pop();
    s1.pop();

    s1.print();

    cout<<"当前栈顶数据:"<<s1.top()<<endl;
    s1.pop();
    s1.print();
    cout<<"当前栈顶数据:"<<s1.top()<<endl;

    cout<<"当前栈中数据个数"<<s1.num()<<endl;
    s1.print();
    return 0;
}

2.vim 配置Makefile/makefile 文件

在这里插入图片描述

3.进入操作:

1.进入调试模式:

gdb + 生成的debug版本的可执行程序

在这里插入图片描述

2.显示代码:

1.命令: list + 行号/ l + 行号(缩写)
1-1:命令: list + 函数/ l + 函数(缩写):显示函数源代码
2.加行号的效果就是从哪一行开始显示!
3.gdb具有记录性回去记录上一次的命令直接输入回车就是上一次的执行的命令再一次执行。l 再次使用默认向后面打印10行。
4.所以输入l 1 之后一直回车就可以打印完整的代码!

在这里插入图片描述

3.运行代码:

1.在gdb模式下输入:run/r(缩写)
2.会发现代码一下就执行完成了,就像在vs下直接生成解决方案并且执行。
3.代码不会停止直接执行完成了!

在这里插入图片描述

4.断点:

我们之前在vs下是通过打断点让程序停下来然后进行调试:

1.命令:break + 行号 / b + 行号 (缩写) 生成一个断点:
1-1:命令:break + 函数名 / b + 函数名称 (缩写) 在函数开头生成一个断点:
2.命令:info + b 查询断点信息:
3.命令:d + 编号 删除断点:

添加断点:显示断点信息!
在这里插入图片描述

断点信息解析
在这里插入图片描述

断点删除
在这里插入图片描述

5.使能断点:

1.命令:diaable + 断点编号 :关闭断点不删除:
2.命令:undisable + 断点编号 :开启断点不删除:

使用关闭断点
在这里插入图片描述

== 打开断点==
在这里插入图片描述

6.进入函数:

命令:vs F11 逐语句: step/s
命令:vs F10 逐过程: next/n

命令使用
在这里插入图片描述

7.显示变量的值和地址:

命令: p + 变量名 :一次显示变量值
命令: p + &变量名 一次显示变量地址
命令: display + 变量名 :一直显示变量值
命令: display + &变量名 一直显示变量地址
命令: undisplay + 编号 :关闭显示变量值
命令: undisplay + 编号 关闭显示变量地址
在这里插入图片描述

8.查看当前函数栈帧信息:

命令:bt
在这里插入图片描述

9.多步跳跃:

命令:continue / c 作用:从当前位置开始连续执行程序到下一个断点才停止
命令:finish 作用:从当前位置开始连续执行到当前函数结束:注意程序是一步一步执行如果存在死循环是出不去的!

continue使用
在这里插入图片描述

finish使用
在这里插入图片描述

10.调整变量的值:

命令:set var 变量名称=要修改的值

在这里插入图片描述


http://www.kler.cn/a/134390.html

相关文章:

  • android dvr黑屏
  • 算法——二分查找(leetcode704)
  • 【JAVA】Java基础—面向对象编程:封装—保护类的内部数据
  • 本地编译ChatNio的问题解决
  • 生成模型——PixelRNN与PixelCNN
  • SpringBoot(十)SpringBoot使用QQ邮箱stmp发送邮件
  • 保姆级 | Nginx编译安装
  • golang学习笔记——条件表达式
  • 【Dubbo】Dubbo负载均衡实现解析
  • nodejs微信小程序-实验室上机管理系统的设计与实现-安卓-python-PHP-计算机毕业设计
  • 2023数维杯国际赛数学建模竞赛选题建议及B题思路讲解
  • Linux本地docker一键部署traefik+内网穿透工具实现远程访问Web UI管理界面
  • OpenAI 地震!首席执行官被解雇,背后的原因是?
  • linux 定时执行脚本
  • 【Flink】系统架构
  • 力扣372周赛
  • 微机原理练习题_13
  • 计算机网络——物理层-信道的极限容量(奈奎斯特公式、香农公式)
  • ElasticSearch快速入门
  • 【论文阅读】VideoComposer: Compositional Video Synthesis with Motion Controllability
  • 2023/11/15JAVA学习(线程池,Executors,网络编程,InetAddress,UDP,TCP,DatagramSocket)
  • 栈和队列概念
  • Nginx的核心配置文件
  • 自学人工智能难吗?
  • SpringBoot整合Redis使用基于注解的缓存
  • AIGC ChatGPT4 读取接口文件并进行可视化分析