预备
测试代码参照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, 且目录位置要对
- root用户, .gdbinit文件放在~/ 目录下
-
其他用户, .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