GDB用法(三)

预备

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

命令历史

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

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

GDB用法(三)_第1张图片

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

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

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

GDB用法(三)_第2张图片

设置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, 保存到文件中

GDB用法(三)_第3张图片

GDB用法(三)_第4张图片

存的是最后十条命令记录

初始化文件(.gdbinit)

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

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

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

GDB用法(三)_第5张图片

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

    GDB用法(三)_第6张图片

    GDB用法(三)_第7张图片

    先切换到普通用户

GDB用法(三)_第8张图片

手动加载.gdbinit文件

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

文件名都不需要是.gdbinit

在工程下新建文件testinit

GDB用法(三)_第9张图片

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

GDB用法(三)_第10张图片

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

自定义gdb命令

(define) 自定义命令

define 命令名

​ 命令

​ …

end

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

documnt 命令名

​ 说明

end

help 命令 // 显示说明

stl中pvector的自定义

define pvector
	if $argc == 0
		help pvector
	else
		set $size = $arg0._M_impl._M_finish - $arg0._M_impl._M_start
		set $capacity = $arg0._M_impl._M_end_of_storage - $arg0._M_impl._M_start
		set $size_max = $size - 1
	end
	if $argc == 1
		set $i = 0
		while $i < $size
			printf "elem[%u]: ", $i
			p *($arg0._M_impl._M_start + $i)
			set $i++
		end
	end
	if $argc == 2
		set $idx = $arg1
		if $idx < 0 || $idx > $size_max
			printf "idx1, idx2 are not in acceptable range: [0..%u].\n", $size_max
		else
			printf "elem[%u]: ", $idx
			p *($arg0._M_impl._M_start + $idx)
		end
	end
	if $argc == 3
	  set $start_idx = $arg1
	  set $stop_idx = $arg2
	  if $start_idx > $stop_idx
	    set $tmp_idx = $start_idx
	    set $start_idx = $stop_idx
	    set $stop_idx = $tmp_idx
	  end
	  if $start_idx < 0 || $stop_idx < 0 || $start_idx > $size_max || $stop_idx > $size_max
	    printf "idx1, idx2 are not in acceptable range: [0..%u].\n", $size_max
	  else
	    set $i = $start_idx
		while $i <= $stop_idx
			printf "elem[%u]: ", $i
			p *($arg0._M_impl._M_start + $i)
			set $i++
		end
	  end
	end
	if $argc > 0
		printf "Vector size = %u\n", $size
		printf "Vector capacity = %u\n", $capacity
		printf "Element "
		whatis $arg0._M_impl._M_start
	end
end

document pvector
	Prints 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 typedef
	pvector v 0 - Prints element[idx] from vector
	pvector v 1 2 - Prints elements in range [idx1..idx2] from vector
end 

加载其他库定义的函数

修改工程

GDB用法(三)_第11张图片

main.cpp
#include 
#include 

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 
#include 

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 读取完毕" << 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

GDB用法(三)_第12张图片
GDB用法(三)_第13张图片

你可能感兴趣的:(c++,服务器)