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.等待调试的源代码:

linux基础:4:gdb的使用_第1张图片

#include
#include

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 文件

linux基础:4:gdb的使用_第2张图片

3.进入操作:

1.进入调试模式:

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

linux基础:4:gdb的使用_第3张图片

2.显示代码:

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

linux基础:4:gdb的使用_第4张图片

3.运行代码:

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

linux基础:4:gdb的使用_第5张图片

4.断点:

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

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

添加断点:显示断点信息!
linux基础:4:gdb的使用_第6张图片

断点信息解析
linux基础:4:gdb的使用_第7张图片

断点删除
linux基础:4:gdb的使用_第8张图片

5.使能断点:

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

使用关闭断点
linux基础:4:gdb的使用_第9张图片

== 打开断点==
linux基础:4:gdb的使用_第10张图片

6.进入函数:

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

命令使用
linux基础:4:gdb的使用_第11张图片

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

命令: p + 变量名 :一次显示变量值
命令: p + &变量名 一次显示变量地址
命令: display + 变量名 :一直显示变量值
命令: display + &变量名 一直显示变量地址
命令: undisplay + 编号 :关闭显示变量值
命令: undisplay + 编号 关闭显示变量地址
linux基础:4:gdb的使用_第12张图片

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

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

9.多步跳跃:

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

continue使用
linux基础:4:gdb的使用_第13张图片

finish使用
linux基础:4:gdb的使用_第14张图片

10.调整变量的值:

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

linux基础:4:gdb的使用_第15张图片

你可能感兴趣的:(linux,windows,运维)