GDB用法(一)

news2024/11/24 7:54:57

预备

测试代码

在这里插入图片描述

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何评估一个需求开发通常需要多长时间?

业务人员和产品管理者有时候会想要知道在他们即将进行的项目中&#xff0c;“处理需求”的环节会花费多长时间。但这个问题并没有固定的答案&#xff0c;因为这会取决于很多因素。 有许多已经公开的行业平均数据可以提供参考&#xff0c;它可以提示我们在一个典型项目中应该花…

本质矩阵E推R和T

https://zhuanlan.zhihu.com/p/500798616 https://zhuanlan.zhihu.com/p/435306687

在vue项目中引入vuex使用(引入到vue项目中)

项目下新建store文件 // npm下载后 导入 import Vue from vue import Vuex from vuex// 注册在vue实例上 Vue.use(Vuex)// 定义结构 export default new Vuex.Store({state: {},getters: {},mutations: {},actions: {},modules: {} })//main.js import store from ./storenew …

LLMs参数高效微调(PEFT) Parameter efficient fine-tuning (PEFT)

正如你在课程的第一周所看到的&#xff0c;训练LLMs需要大量的计算资源。完整的微调不仅需要内存来存储模型&#xff0c;还需要在训练过程中使用的各种其他参数。 即使你的计算机可以容纳模型权重&#xff0c;最大模型的权重现在已经达到几百GB&#xff0c;你还必须能够为优化…

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…

【C++】—— C++11之线程库

前言&#xff1a; 在本期&#xff0c;我将给大家介绍的是 C11 中新引进的知识&#xff0c;即关于线程库的相关知识。 目录 &#xff08;一&#xff09;线程库的介绍 1、线程库的由来 2、线程库的简单介绍 &#xff08;二&#xff09;线程函数参数 &#xff08;三&#xf…

在线外卖平台源码 美团外卖源码 支持多商户+多样化配送费模式+本土外卖平台+支持第三方配送

进云仿美团外卖源码是一个进云源生插件&#xff0c;支持多商户多样化配送费模式本土外卖平台支持第三方配送&#xff0c;运行需要进云框架支撑&#xff01; 特点&#xff1a; 1、多样化配送费模式&#xff1b; 2、板块-绑定商户分类机制&#xff1b; 3、板块显示时间&#…

应急物资管理系统|库房三维可视化

智慧应急物资管理系统&#xff08;智装备DW-S300&#xff09;是一套成熟系统&#xff0c;依托互3D技术、云计算、大数据、RFID技术、数据库技术、AI、视频分析技术对RFID智能仓库进行统一管理、分析的信息化、智能化、规范化的系统。 政府相关部门设立的应急物资库是防灾救灾、…

javaCV实现java图片ocr提取文字效果

引入依赖&#xff1a; <dependency><groupId>org.bytedeco</groupId><artifactId>javacv-platform</artifactId><version>1.5.5</version></dependency> 引入中文语言训练数据集&#xff1a;chi_sim GitHub - tesseract-ocr…

Failed to load ApplicationContext解决办法,spring版本问题

有如下报错&#xff1a; "D:\Program Files\Java\jdk-13.0.1\bin\java.exe" -agentlib:jdwptransportdt_socket,address127.0.0.1:7325,suspendy,servern -ea -Didea.test.cyclic.buffer.size1048576 -Dfile.encodingUTF-8 -classpath "D:\Program Files\JetBr…

飞腾CPU如何使用PXE方式安装麒麟桌面系统?

目前国产CPU(桌面级、服务器级)中,飞腾应用较为广泛,在飞腾CPU架构下,搭载以银河麒麟V10 SP1系统为主,下面我们从环境准备、环境搭建、UEFI PXE功能确认、x86笔记本软件环境配置四部分来介绍国产笔记本电脑飞腾CPU使用PXE方式安装银河麒麟V10 SP1系统的详细过程。 一、环…

【RISC-V】RISC-V寄存器简介

一、通用寄存器 32位RISC-V体系结构提供32个32位的整型通用寄存器寄存器别名全称说明X0zero零寄存器可做源寄存器(rs)或目标寄存器(rd)X1ra链接寄存器保存函数返回地址X2sp栈指针寄存器指向栈的地址X3gp全局寄存器用于链接器松弛优化X4tp线程寄存器常用于在OS中保存指向进程控…

初阶数据结构(五) 栈的介绍与实现

&#x1f493;博主csdn个人主页&#xff1a;小小unicorn&#x1f493; ⏩专栏分类&#xff1a;C &#x1f69a;代码仓库&#xff1a;小小unicorn的学习足迹&#x1f69a; &#x1f339;&#x1f339;&#x1f339;关注我带你学习编程知识 栈 栈的介绍栈的概念栈的结构 栈的实现…

Spring Framework CVE-2020-5408 CORS 配置漏洞

文章目录 0.前言1.参考文档2.基础介绍3.解决方案3.1. CrossOrigin限制指定来源3.1. WebMvcConfigurer 限制指定来源3.3. 其他用法1. 在方法上使用CrossOrigin&#xff1a;2. 在Controller上使用CrossOrigin&#xff1a;3. 设置多个源&#xff1a;4. 设置所有源&#xff1a;5. …

nginx服务与调优

一、nginx概述&#xff1a; 1.Nginx简介&#xff1a; Nginx是一个高性能的HTTP和反向代理服务器。是一款轻量级的高性能的web服务器/反向代理服 务器/电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器&#xff0c;单台物理服务器可支持30 000&#xff5e;50 000个并发请求…

初识umi

一、umi简介 Umi&#xff0c;中文发音为「乌米」&#xff0c;是可扩展的企业级前端应用框架。Umi 以路由为基础的&#xff0c;同时支持配置式路由和约定式路由&#xff0c;保证路由的功能完备&#xff0c;并以此进行功能扩展。然后配以生命周期完善的插件体系&#xff0c;覆盖…

运行命令出现错误 /bin/bash^M: bad interpreter: No such file or directory

在系统上运行一个 Linux 的命令的时候出现下面的错误信息&#xff1a; -bash: ./build.sh: /bin/bash^M: bad interpreter: No such file or directory 这个是在 Windows 作为 WSL 的时候出的错误。 原因和解决 出现问题的原因在于脚本在 Windows 中使用的回车换行和 Linux …

ANSYS软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 ANSYS是一款全球领先的工程仿真软件&#xff0c;广泛应用于机械、电气、流体、热力学等领域。它提供了强大的建模、网格划分、材料库、边界条件和载荷、求解器、结果后处理、批处理和脚本编程、多物理场仿真、协同设计和教育版等…

深入理解Android消息机制的原理

Handler & Looper & MessageQueue关系简述 一个线程至多有一个looper&#xff1b;一个looper有一个mq&#xff1b;一个mq对应多个message&#xff1b;一个message对应多个handler。消息类型&#xff1a;同步、异步、同步屏障消息。无限循环&#xff1a;在队列中没有消…

【C++从0到王者】第二十四站:多态的底层原理

文章目录 前言一、虚函数表二、一道经典的例题三、深度剖析多态的条件之一&#xff1a;为什么必须是父类的指针或引用四、深度剖析多态的条件之二&#xff1a;为什么是虚函数的重写/覆盖&#xff1f;五、虚函数表的一些总结六、关于Func3的验证七、动态绑定与静态绑定八、总结 …