GDB用法(一)

预备

测试代码

在这里插入图片描述

main.cpp
#include <iostream>
#include <vector>
#include "student.h"

using namespace std;

int add(int a, int b)
{
    return a + b;
}

int main()
{
    vector<int> v = {1, 3};
    
    Student* s1 = new Student("zz", 20);
    Student* s2 = new Student("aa", 23);
    Student* s3 = new Student("bb", 26);

    int sum = add(s1->GetAge(), s2->GetAge());
    
    // 显示Student信息
    cout << s1->ToString() << endl;
    cout << s2->ToString() << endl;
    cout << s3->ToString() << endl;

    delete s1;
    delete s2;
    delete s3;

    return 0;
}
Functions/student.h
#ifndef _STUDENT_H_
#define _STUDENT_H_

#include <vector>
#include <string>

class Student
{
private:
    std::string m_name;
    int m_age;
    
public:
    Student(std::string name, int age);
    
    int GetAge() const;
    std::string GetName() const;
    std::string ToString() const;
};

#endif
Functions/student.cpp
#include "student.h"

Student::Student(std::string name, int age): m_name(name), m_age(age)
{

}

int Student::GetAge() const
{
    return m_age;
}

std::string Student::GetName() const
{
    return m_name;
}

std::string Student::ToString() const
{
    return "学生姓名: " + m_name + "学生年纪: " + std::to_string(m_age);
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.10)

project(main)

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -Wall")

INCLUDE_DIRECTORIES(./)
INCLUDE_DIRECTORIES(./Functions)

AUX_SOURCE_DIRECTORY(./ MAIN)
AUX_SOURCE_DIRECTORY(./Functions FUNCTION)

add_executable(main ${MAIN} ${FUNCTION})

(gdb) 启动

gdb 可执行文件

在这里插入图片描述

在这里插入图片描述

后面带可执行文件, gdb会把可执行文件的符号表加载到gdb中

(break/b) 设置断点

break 函数名

在这里插入图片描述

break 行号

断点是源程序中行号, 注意编译选项不要优化代码, 不然行号和优化后的代码对应不上

在这里插入图片描述

break 文件名: 行号

在这里插入图片描述

break 文件名:函数名

image-20230827220846409

break + 偏移量

break - 偏移量

在运行时, 进入断点后, 使用偏移量, 对断点行号加/减多少行

!image-20230827221503251

break *地址

image-20230827221559142

(info break/i b) 展示所有设置的断点

在这里插入图片描述

(run/r) 运行

run 参数

run后面可以带参数, 也就是给运行程序加参

修改main.cpp

#include <iostream>
#include <vector>
#include "student.h"

using namespace std;

int add(int a, int b)
{
    return a + b;
}

int main(int argc,char *argv[])
{
    cout << "参数个数:" << argc << endl;
    for(int i = 0; i < argc; i++)
    {
        cout << "参数[" << i << "]:" << argv[i] << endl;
    }
    
    vector<int> v = {1, 3};
    
    Student* s1 = new Student("zz", 20);
    Student* s2 = new Student("aa", 23);
    Student* s3 = new Student("bb", 26);

    int sum = add(s1->GetAge(), s2->GetAge());
    
    // 显示Student信息
    cout << s1->ToString() << endl;
    cout << s2->ToString() << endl;
    cout << s3->ToString() << endl;

    delete s1;
    delete s2;
    delete s3;

    return 0;
}

在这里插入图片描述

(backtrace/bt) 显示栈帧

bt // 显示所有栈帧

bt N //显示开头N个栈帧

bt -N // 显示最后N个栈帧

bt full // 不仅显示栈帧, 还显示局部变量

bt full N

bt full -N

在这里插入图片描述

(print/p) 显示变量

p /格式 变量

格式说明
x显示为十六进制数
d显示为十进制数
u显示为无符号十进制数
o显示为八进制数
t显示为二进制数, t的由来是two
a地址
c显示为字符(ASCII)
f浮点小数
s显示为字符串
i显示为机器语言(仅在显示内存的x命令中可用)

在这里插入图片描述

(info registers/info reg) 显示寄存器

寄存器名前面加$, 可现实各个寄存器的内容

在这里插入图片描述

(x) 显示内存的内容

x/NFU ADDR

// ADDR为希望显示的地址

// N为重复次数

// F为前面显示变量中的格式(x, d, u, o, t, a, c, f, s, i)

// U为单位

U代表单位说明
b字节
h半字(2字节)
w字(4字节/默认值)
g双字(8字节)

x/i 为显示汇编指令

image-20230827225251888

从rip所指地址开始的10条指令(i)

image-20230827225724647

(dissassemble/disas) 反汇编

dissassemble [FUNCTION] // 反汇编当前函数

在这里插入图片描述

dissassemble 开始地址 结束地址 // 反汇编从开始地址到结束地址之前的部分

(next/n) 单步执行, 不会进入函数内部执行

n 行数

image-20230827231836533

(nexti/ni) 汇编指令的单步执行

需要设置set disassemble-next-line on, 让gdb打印出下一条要执行的汇编代码

image-20230827232735351

在这里插入图片描述

(step/s) 单步执行, 会进入函数内部执行

s 行数

image-20230827231804673

(stepi/si) 汇编指令的单步执行

在这里插入图片描述

(continue/c) 继续执行

c 次数

后面加次数是指定次数忽略断点, c 5则5次遇到断点不停止, 第6次遇到断点时才暂停执行

在这里插入图片描述

跳过了参数0, 参数1,参数2, 3次断点, 第4次断点时暂停执行

(watch) 监视点

// 软件观察点

watch [options] <表达式> // 表达式发生变化时暂停运行

// 这里的表达式是指常量或变量

选项(options)表达式
-l/-location指定只在被监视表达式的特定位置暂停程序的执行,能够避免多线程环境下的停顿问题
-r/-read可以指定只在被监视表达式被读取时停止程序的执行
-w/-write只在被监视表达式被修改时停止程序的执行
-c在被监视变量被修改的时候,停止后继续执行的次数。如果指定了count,则每次监视到变量修改时计数器减1,当计数器为0时,程序会停止执行
-s可以指定watch只在指定变量或表达式的值满足某个条件时停止程序的执行

// 硬件观察点

awatch <表达式> // 表达式被访问, 改变时暂停运行

rwatch <表达式> // 表达式被访问时暂停运行

设置监视点会降低速度

(delete/d) 删除断点和监视点

delete 编号

在这里插入图片描述

(set variable) 改变变量的值

set variable <变量> = <表达式>

可以在运行时随意修改变量的值

在这里插入图片描述

(generate-core-file) 生成内核转储文件

generate-core-file

在这里插入图片描述

生成在当前目录下

在这里插入图片描述

(gcore) linux工具生成内核转储文件

gcore -o 保存路径 pid

修改main.cpp

#include <iostream>
#include <vector>
#include "student.h"

using namespace std;

int add(int a, int b)
{
    return a + b;
}

int main(int argc,char *argv[])
{
    std::cout << "程序开始" << std::endl;
    while(true)
    {
        // cout << "参数个数:" << argc << endl;
        // for(int i = 0; i < argc; i++)
        // {
        //     cout << "参数[" << i << "]:" << argv[i] << endl;
        // }
        
        vector<int> v = {1, 3};
        
        Student* s1 = new Student("zz", 20);
        Student* s2 = new Student("aa", 23);
        Student* s3 = new Student("bb", 26);

        int sum = add(s1->GetAge(), s2->GetAge());
        
        // 显示Student信息
        // cout << s1->ToString() << endl;
        // cout << s2->ToString() << endl;
        // cout << s3->ToString() << endl;

        delete s1;
        delete s2;
        delete s3;
    }
  

    return 0;
}

从命令行直接生成内核转储文件

这里的路径需要是存在的

在这里插入图片描述

也可以 脚本每个多久生成一次core文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/92767.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电路学习+硬件每日学习十个知识点(40)23.8.20 (希腊字母读音,阶跃信号和冲激信号的关系式,信号的波形变换,信号的基本运算,卷积积分,卷积和)

文章目录 1.信号具有时间特性和频率特性。2.模拟转数字&#xff0c;抽样、量化、编码3.阶跃信号和冲激信号4.信号的波形变换&#xff08;时移、折叠、尺度变换&#xff09;5.信号的基本运算&#xff08;加减、相乘、微分与积分、差分与累加&#xff09;5.1 相加减5.2 相乘5.3 微…

Android JNI系列详解之AS创建Native C++项目

一、前提 Android Studio版本&#xff1a;Android Studio Electric Eel | 2022.1.1 Patch 1 二、创建Native C项目 1.新建项目 2.选择新建Native C项目 3.New Project 4.选择C标准库的支持版本 5.项目自带的默认生成的代码 6.buil.gradle中也自带了CMakeList的配置&#xff08;…

4、Spring之Bean生命周期源码解析(创建)

Spring最重要的功能就是帮助程序员创建对象(也就是IOC),而启动Spring就是为创建Bean对象做准备,所以我们先明白Spring到底是怎么去创建Bean的,也就是先弄明白Bean的生命周期。 Bean的生命周期就是指:在Spring中,一个Bean是如何生成的,如何销毁的。 Bean生命周期流程图…

微服务dubbo

微服务是一种软件开发架构风格&#xff0c;它将一个应用程序拆分成一组小型、独立的服务&#xff0c;每个服务都可以独立部署、管理和扩展。每个服务都可以通过轻量级的通信机制&#xff08;通常是 HTTP/REST 或消息队列&#xff09;相互通信。微服务架构追求高内聚、低耦合&am…

Matlab图像处理-乘法运算

乘法运算 两幅图像进行乘法运算主要实现两个功能&#xff1a; 一是可以实现掩模操作&#xff0c;即屏蔽图像的某些部分&#xff1b; 二是如果一幅图像乘以一个常数因子&#xff0c;如果常数因子大于1&#xff0c;将增强图像的亮度&#xff0c;如果因子小于1则会使图像变暗。…

二、数学建模之整数规划篇

1.定义 2.例题 3.使用软件及解题 一、定义 1.整数规划&#xff08;Integer Programming&#xff0c;简称IP&#xff09;&#xff1a;是一种数学优化问题&#xff0c;它是线性规划&#xff08;Linear Programming&#xff0c;简称LP&#xff09;的一个扩展形式。在线性规划中&…

《入门级-Cocos2dx4.0 塔防游戏开发》---第七课:游戏界面开发(自定义Layer)

目录 一、开发环境 二、开发内容 2.1 添加资源文件 2.2 游戏MenuLayer开发 2.3 GameLayer开发 三、演示效果 四、知识点 4.1 sprite、layer、scene区别 4.2 setAnchorPoint 一、开发环境 操作系统&#xff1a;UOS1060专业版本。 cocos2dx:版本4.0 环境搭建教程&…

06.sqlite3学习——DQL(数据查询)(全)

目录 SQLite——DQL&#xff08;数据查询&#xff09; 数据集 select语句 条件查询 比较 确定范围 确定集合 like 查询记录 查询不重复的记录 排序和限制 排序 限制 聚合 聚合函数 语法 SQLite Group By详解 语法 实例 SQLite Having 子句 语法 实例 多…

BUUCTF [SWPU2019]Web1

​ 这是一道sql二次注入题目&#xff0c;但是注入点并不在登录处 注册一个用户然后登录 广告申请处进行sql注入 你会发现过滤了很多关键字 空格#information等等 这里用到了一些绕过技巧 使用 /**/ 代替空格 union/**/select/**/1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,1…

Docker网络原理及案例详解

文章目录 简介Docker网络产生的过程Docker network的作用网络模式网络模式---bridge网络模式---host网络模式---none 自定义网络 简介 Docker网络实现容器之间通信和连接外部网络的功能,主要的网络连接方式有桥接网络&#xff08;Bridge Network、主机网络&#xff08;Host Ne…

详细了解G1、了解G1、G1垃圾收集器详解、G1垃圾回收器简单调优

4.详细了解G1&#xff1a; 4.1.一&#xff1a;什么是垃圾回收 4.2.了解G1 4.3.G1 Yong GC 4.4.G1 Mix GC 4.5.三色标记算法 4.6.调优实践 5.G1垃圾收集器详解 5.1.G1垃圾收集器 5.2.G1的堆内存划分 5.3.G1的运行过程 5.4.三色标记 5.4.1.漏标问题 5.5.记忆集与卡表 5.6.安全点与…

iconfont 图标在vue里的使用

刚好项目需要使用一个iconfont的图标&#xff0c;所以记录一下这个过程 1、iconfont-阿里巴巴矢量图标库 这个注册一个账号&#xff0c;以便后续使用下载代码时需要 2、寻找自己需要的图标 我主要是找两个图标 &#xff0c;一个加号&#xff0c;一个减号&#xff0c;分别加入到…

Python爬虫实战案例——第二例

某某美剧剧集下载(从搜索片名开始) 本篇文章主要是为大家提供某些电影网站的较常规的下载电影的分析思路与代码思路(通过爬虫下载电影)&#xff0c;我们会从搜索某部影片的关键字开始直到成功下载某一部电影。 地址&#xff1a;aHR0cHM6Ly93d3cuOTltZWlqdXR0LmNvbS9pbmRleC5od…

基于全新电脑环境安装pytorch的GPU版本

前言&#xff1a; 距离第一次安装深度学习的GPU环境已经过去了4年多&#xff08;当时TensorFlow特别麻烦&#xff09;&#xff0c;现在发现安装pytorch的GPU版本还是很简单方便的&#xff0c;流程记录如下。 安装步骤&#xff1a; 步骤一&#xff1a;官网下载Anaconda Free…

局域网中电脑共享文件给手机

学习资源&#xff1a; 局域网共享&#xff1a;这样设置&#xff0c;你可以轻松拷贝任何电脑的文件。_哔哩哔哩_bilibili 可以实现什么效果&#xff1f; 连接同一个WIFI&#xff0c;电脑端为服务端&#xff0c;提供共享文件&#xff0c;手机是客户端&#xff0c;可以读取服务端…

C语言——指针进阶(一)

目录 ​编辑 一.字符指针 1.1 基本概念 1.2 面试题 二.指针数组 三.数组指针 3.1 数组指针的定义 3.2 &数组名VS数组名 3.3 数组指针的使用 四.数组参数、指针参数 4.1 一维数组传参 ​编辑 4.2 二维数组传参 4.3 一级指针传参 4.4 二级指针传参 ​编辑 五.…

windows系统 Fooocus 图片生成模型 ,4-6GB显存即可玩,27S/p

安装步骤: 1.下载程序代码框架,大小2GB ,下载 ​​​​​​https://github.com/lllyasviel/Fooocus/releases/download/1.0.35/Fooocus_win64_1-1-1035.7z 2.下载模型文件sd_xl_base_1.0_0.9vae.safetensors ,大小6GBhttps://huggingface.co/stabilityai/stable-diffusion-x…

软件配置安装(破解)--- maven下载配置

检查环境是否已有 首先检查一下电脑里有无maven环境&#xff0c;有的话就不用安装了 查看path环境中没有maven&#xff0c;开始准备接下来的重头戏 下载maven 下载bin.zip版 解压mavenxxxbin.zip &#xff08;建议把解压的文件放在一个文件夹内&#xff0c;命名英文的env…

利用敏捷开发工具实现敏捷项目管理的实践经验分享

Scrum中非常强调公开、透明、直接有效的沟通&#xff0c;这也是“可视化的管理工具”在敏捷开发中如此重要的原因之一。通过“可视化的管理工具”让所有人直观的看到需求&#xff0c;故事&#xff0c;任务之间的流转状态&#xff0c;可以使团队成员更加快速适应敏捷开发流程。 …

8.缓冲区管理

第五章 I/O管理 缓冲区管理 双缓冲区&#xff1a;T<CM 假设初始状态缓冲区1满&#xff0c;缓冲区2空&#xff0c;工作区为空。 刚开始缓冲区2为空&#xff0c;所以设备可以向缓冲区2中冲入数据耗时T&#xff0c;另一方面刚开始缓冲区1中是满的&#xff0c;所以刚开始就可…