linux基础:4:gdb的使用

本文详细介绍了如何在Linux环境下使用JDB和GDB进行程序调试,包括引入、在Makefile中生成debug版本的可执行程序,以及一系列调试操作如设置断点、查看变量值、执行代码等。
摘要由CSDN通过智能技术生成

一.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 变量名称=要修改的值

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值