GDB用法(三)

预备

测试代码参照GDB用法(二)

命令历史

可以将命令历史保存到文件中

(show history) 展示当前gdb中history的设置信息

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

设置expansion
(set history expansion) 打开历史扩展

能使用历史处理命令对历史数据进行处理, 暂不细究

(show history expansion) 展示历史扩展配置

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

设置save
(set history save) 启用命令历史保存到文件

等关闭的时候就会保存到history save中的文件夹中

(show history save) 展示命令历史保存的配置

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

设置size
(set history size 数字) 设置保存的命令条数

默认条数256

(show history size) 展示设置的命令条数配置

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

设置保存文件filename
(set history filename 文件名) 设置保存历史文件

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(show history filename) 展示历史文件名

默认是当前目录下的.gdb_history文件中

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

关闭gdb, 保存到文件中

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

存的是最后十条命令记录

初始化文件(.gdbinit)

增加.gdbinit文件

p "自动 gdbinit 初始化完成!"
自动调用.gdbinit文件

只能叫.gdbinit, 且目录位置要对

  1. root用户, .gdbinit文件放在~/ 目录下

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 其他用户, .gdbinit文件放在/home/用户名/ 下, 对于用户本身, 其实也就是在~/目录下

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    先切换到普通用户

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

手动加载.gdbinit文件

source 目录/文件 // 用linux命令读取文件内容

文件名都不需要是.gdbinit

在工程下新建文件testinit

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

p "手动加载 testinit文件成功"

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

之前gdb设置的一些参数, 退出gdb后再进入配置就不生效了, 写入初始化文件则会一直生效

自定义gdb命令

(define) 自定义命令

define 命令名

​ 命令

​ …

end

(document) 给自定义命令添加说明

documnt 命令名

​ 说明

end

help 命令 // 显示说明

stl中pvector的自定义

define pvectorif $argc == 0help pvectorelseset $size = $arg0._M_impl._M_finish - $arg0._M_impl._M_startset $capacity = $arg0._M_impl._M_end_of_storage - $arg0._M_impl._M_startset $size_max = $size - 1endif $argc == 1set $i = 0while $i < $sizeprintf "elem[%u]: ", $ip *($arg0._M_impl._M_start + $i)set $i++endendif $argc == 2set $idx = $arg1if $idx < 0 || $idx > $size_maxprintf "idx1, idx2 are not in acceptable range: [0..%u].\n", $size_maxelseprintf "elem[%u]: ", $idxp *($arg0._M_impl._M_start + $idx)endendif $argc == 3set $start_idx = $arg1set $stop_idx = $arg2if $start_idx > $stop_idxset $tmp_idx = $start_idxset $start_idx = $stop_idxset $stop_idx = $tmp_idxendif $start_idx < 0 || $stop_idx < 0 || $start_idx > $size_max || $stop_idx > $size_maxprintf "idx1, idx2 are not in acceptable range: [0..%u].\n", $size_maxelseset $i = $start_idxwhile $i <= $stop_idxprintf "elem[%u]: ", $ip *($arg0._M_impl._M_start + $i)set $i++endendendif $argc > 0printf "Vector size = %u\n", $sizeprintf "Vector capacity = %u\n", $capacityprintf "Element "whatis $arg0._M_impl._M_startend
enddocument pvectorPrints std::vector<T> information.Syntax: pvector <vector> <idx1> <idx2>Note: idx, idx1 and idx2 must be in acceptable range [0..<vector>.size()-1].Examples:pvector v - Prints vector content, size, capacity and T typedefpvector v 0 - Prints element[idx] from vectorpvector v 1 2 - Prints elements in range [idx1..idx2] from vector
end 

加载其他库定义的函数

修改工程

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

main.cpp
#include <iostream>
#include <vector>using namespace std;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};return 0;
}
Functions/pFun.h
#ifndef _PFUN_H_
#define _PFUN_H_#include <iostream>
#include <vector>void pvector_self(const std::vector<int> v);#endif
Functions/pFun.cpp
#include "pFun.h"void pvector_self(const std::vector<int> v)
{if(v.empty()){std::cout << "为空" << std::endl;}for(int i = 0; i < v.size(); i++){std::cout << "num" << i << ": " << v[i];if(i != v.size() - 1){std::cout << std::endl;}  }std::cout << std::endl;std::cout << "vector<int> 读取完毕" << std::endl;
}
Functions/CMakeLists.txt
cmake_minimum_required(VERSION 3.10)AUX_SOURCE_DIRECTORY(. FUNCTIONS_SOURCE)add_library(Functions SHARED ${FUNCTIONS_SOURCE})
CMakeLists.txt
cmake_minimum_required(VERSION 3.10)project(main)SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -Wall")INCLUDE_DIRECTORIES(./)AUX_SOURCE_DIRECTORY(./ MAIN)add_subdirectory(Functions)add_executable(main ${MAIN})target_include_directories(main PUBLIC Functions)
target_link_libraries(main Functions)
testinit
p "手动加载 testinit文件成功"set $pvector_self = pvector_self

Functions/CMakeLists.txt 会生成 libFunctions.so, gdb就要调用这个函数的输出方法, 输出vector

编译生成libFunctions.so和main

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是原生IP?原生IP与住宅IP有何区别?

相信许多做跨境的都会接触到IP代理&#xff0c;比如电商平台、社媒平台、收款平台等等&#xff0c;都会检测IP。那也会经常听到一些词汇&#xff1a;原生IP、住宅IP&#xff0c;这两者之间有什么区别呢&#xff1f;什么业务需要用到呢&#xff1f;接下来带大家具体了解一下。 什…

软件架构设计(十三) 构件与中间件技术

中间件的定义 其实中间件是属于构件的一种。是一种独立的系统软件或服务程序,可以帮助分布式应用软件在不同技术之间共享资源。 我们把它定性为一类系统软件,比如我们常说的消息中间件,数据库中间件等等都是中间件的一种体现。一般情况都是给应用系统提供服务,而不是直接…

Jenkins介绍

Jenkins介绍 持续集成、持续部署的工具很多&#xff0c;其中Jenkins是一个开源的持续集成平台。 Jenkins涉及到将编写完毕的代码发布到测试环境和生产环境的任务&#xff0c;并且还涉及到了构建项目等任务。 Jenkins需要大量的插件保证工作&#xff0c;安装成本较高&#xff0…

MyBatis框架中各种参数类型绑定的方式

MyBatis框架中各种参数类型绑定的方式 一、MyBatis参数绑定 MyBatis框架中&#xff0c;通过Mapper接口和Mapper映射文件的方式来操作数据库的时候&#xff0c;可能需要通过Mapper接口中的方法传递相应的参数拼接到SQL语句上面&#xff0c;那么Mybatis将传递的参数映射到对应S…

Debian11安装MySQL8.0,链接Navicat

图文小白教程 1 下载安装MySQL1.1 从MySQL官网下载安装文件1.2 安装MySQL1.3 登录MySQL 2 配置Navicat远程访问2.1 修改配置2.2 Navicat 连接 end: 卸载 MySQL 记录于2023年9月&#xff0c;Debian11 、 MySQL 8.0.34 1 下载安装MySQL 1.1 从MySQL官网下载安装文件 打开 MySQ…

FFmpeg入门之FFmpeg源码编译

1.源码下载: git clone https://github.com/FFmpeg/FFmpeg.git windows : macos: ubuntu: 2.编译FFmpeg CompilationGuide – FFmpeg windows: 1.下载yasm并安装 : Download - The Yasm Modular Assembler Project 下载后复制到c:/windows 2.下载SDL 3.下载H264/265源码 git…

stringBuffer.append(“字符串参数“);这个在字符串参数后添加空格怎么写

stringBuffer.append(“字符串参数”);这个在字符串参数后添加空格怎么写&#xff1f; 要在字符串参数后添加空格&#xff0c;可以直接在字符串参数的末尾使用空格字符&#xff0c;像这样&#xff1a; stringBuffer.append("字符串参数 ");这样就在字符串参数后添加…

【HTML5高级第三篇】drag拖拽、音频视频、defer/async属性、dialog应用

文章目录 一、拖拽事件1.1 拖拽事件1.2 案例&#xff1a;拖拽丢弃图片 二、音频和视频三、defer 与 async 属性3.1 概述3.2 示例一&#xff1a;3.3 示例二&#xff1a; 四、dialog 元素 一、拖拽事件 原生JavaScipt案例合集 JavaScript DOM基础 JavaScript 基础到高级 Canvas…

637. 二叉树的层平均值

637. 二叉树的层平均值 题目-简单难度示例1. bfs 题目-简单难度 给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。 示例 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&…

爬虫逆向实战(29)-某蜂窝详情页(cookie、混淆、MD5、SHA)

一、数据接口分析 主页地址&#xff1a;某蜂窝 1、抓包 通过抓包可以发现数据是静态的&#xff0c;在html中。 2、判断是否有加密参数 请求参数是否加密&#xff1f; 无请求头是否加密&#xff1f; 无响应是否加密&#xff1f; 无cookie是否加密&#xff1f; 通过查看“c…

Windows wsl2安装Ubuntu

wsl&#xff08;Windows Subsystem for Linux&#xff09;即适用于Windows的Linux子系统&#xff0c;是一个实现在Windows 10 / 11上运行原生Linux的技术。 wsl2 为其迭代版本&#xff0c;可以更好的在Windows上运行Linux子系统。 这里以 Windows 11 安装Ubuntu作为示例。 开启…

kafka学习-消费者

目录 1、消费者、消费组 2、心跳机制 3、消费者常见参数配置 4、订阅 5、反序列化 基本概念 自定义反序列化器 6、位移提交 6.1、自动提交 6.2、手动提交 同步提交 异步提交 7、再均衡 7.1、定义与基本概念 7.2、缺陷 7.3、如何避免再均衡 7.4、如何进行组内分…

电脑同时连接有线和无线网络怎么设置网络的优先级

电脑同时连接有线和无线网络怎么设置网络的优先级&#xff1a; 我们知道在 笔记本电脑系统 中&#xff0c;可以通过有线或无线网络进行联网。如果电脑在有线网络和无线网络同时存在的情况&#xff0c;应该怎么设置有线网络优先连接呢?对此我们提供下面的方法可以让电脑在有Wi…

链路追踪Skywalking快速入门

目录 1 Skywalking概述1.1 微服务系统监控三要素1.2 什么是链路追踪1.2.1 链路追踪1.2.2 OpenTracing1、数据模型&#xff1a;2、核心接口语义 1.3 常见APM系统1.4 Skywalking介绍1、SkyWalking 核心功能&#xff1a;2、SkyWalking 特点&#xff1a;3、Skywalking架构图&#x…

【C++】string类模拟实现上篇(附完整源码)

目录 前言1. string的基本结构2. 构造函数、析构函数2.1 构造函数的实现2.1.1带参构造函数 2.2析构函数2.3无参构造函数2.4无参和带参构造函数合并 3. string的遍历3.1 operator[ ]3.2迭代器模拟实现 (简单实现&#xff09;3.3 const迭代器模拟实现 4. 数据的增删查改4.1 reser…

基于TensorFlow 2.3.0 的手势识别系统设计

一、开发环境 Windows 10PyCharm 2021.3.2Python 3.7TensorFlow 2.3.0 二、制作数据集&#xff0c;作者使用了10个类别的手势数集据 三、开始训练模型&#xff0c;作者使用自己开发的软件进行训练模型&#xff0c;方便快捷。软件介绍及下载地址&#xff1a; 手把手教你使用T…

原生js之dom表单改变和鼠标常用事件

那么好,本次我们聊聊表单改变时如何利用onchange方法来触发input改变事件以及鼠标常用的滑入滑出,点击down和点击up事件. 关于onchange方法 onchange方法在鼠标输入完后点击任何非输入框位置时触发.触发时即可改变原有输入框的值. out 、leave、over、down、up鼠标方法 当用…

KMP超高效匹配算法

简介&#xff1a; KMP算法是一种改进的字符串匹配算法&#xff0c;其中&#xff0c;KMP算法的运用核心是利用匹配失败后的信息&#xff0c;最大进度的减少模式串与目标串的匹配次数以达到快速匹配的效果。算法与暴力求解的改进在于每当一趟匹配过程中出现的字符比较不相等时&am…

Django创建应用、ORM的进阶使用及模型类数据库迁移

1 Django项目创建第一个应用 Django 项目就是基于 Django 框架开发的 Web 应用&#xff0c;它包含了一组配置和多个应用&#xff0c;我们把应用称之为 App&#xff0c;在前文中对它也做了相应的介绍&#xff0c;比如 auth、admin&#xff0c;它们都属于 APP。 一个 App 就是一…

postman token 请求头添加

思路&#xff1a; 1、登录成功后将 得到的token设置为集合变量 2、在需要携带Authorization的请求头上使用该集合变量 关键代码 const responseData pm.response.json(); if(responseData.code 1) {// 获取tokenconst {data:{token}} responseData// 设置为集合变量pm.colle…