GDB的基本使用(1)

我有话说

        因为时间和精力原因,本文写的虎头蛇尾了,除了启动调试与程序执行以外只有少量截图演示,只是简单的说明。如果有需要可以联系我,我有时间的话会把演示补上,谢谢理解。


启动调试与程序执行

启动调试并传递参数

命令(这三者在功能上没有任何区别 )功能
gdb --args <exe> <args>在启动dgb时传入参数
set args <args>在启动gdb后,运行程序前传入参数
r/run <args>在启动gdb后,运行程序时传入参数

        测试代码: 

#include <iostream>
using namespace std;int main(int argc, char** argv) {cout << "i have "<< argc << " arguments " <<"there are my arguments: " << endl;for (int i = 0; i < argc; ++i) {cout << argv[i] << endl;}return 0;
} 

        不传入参数:

        三种传入参数的方法:

 


附加进进程 

        附加进进程主要是用于调试已经启动的进程,在附加进进程后,进程会进入追踪暂停状态(tracing stop / t 状态),当退出gdb时进程会继续运行

附加进进程查看进程id的方法
gdb attach <pid>ps -ajx 
gdb --pid <pid>ps -aux

        测试代码:

#include <iostream>
#include <thread>
#include <chrono>
using namespace std;int main() {size_t i = 1;while (true) {cout << "这是第 " << i++ << " 次循环" << endl;this_thread::sleep_for(chrono::seconds(1));}return 0;
}

        测试结果:


逐过程调试和逐语句调试以及退出当前函数

命令功能
next/n
 
逐过程调试
单步执行(step-over),遇到函数跳过函数
step/s逐语句调试
单步执行(step-into),遇到函数进入函数
continue/c运行到下一个断点处
finish退出当前函数

        测试代码:

#include <iostream>
#include <string>
using namespace std;void test() {string str = "gdb";str += " welcome";str += " you";cout << str << endl;
}int main() {test();return 0;
}

        测试结果:


退出调试

命令功能
detach
 
分离当前正在调试的进程(必须处于启动状态)
quit/q退出gdb

        测试代码:

#include <iostream>
#include <thread>
#include <chrono>
using namespace std;int main() { cout << "enter main function" << endl;int i = 0;for (;;) {cout << "i have looped " << ++i << " times" << endl;this_thread::sleep_for(chrono::seconds(1));}return 0; 
}

        测试结果: 


断点管理

设置断点

命令功能
break/b <filename : line>在源代码的某一行设置断点,当调试的程序为单文件程序时,可以省略文件名
b <func_name>

为函数设置断点。如果有同名函数,就为所有同名函数设置断点

如果只想为特定的函数设置断点,就需要添加限定符,以便区分到底是为哪个函数设置断点

rb <regex>为满足正则表达式的函数设置断点
b <location> if <expression>设置条件断点,当条件成立时断点就会停止进程。常用在循环中,但其他场景也能用
tb <location>设置临时断点,该断点只会命中一次
b [+ -] <offest>通过偏移量设置断点,当前代码执行到某一行时,如果要为当前代码行的前面某一行或者后面某一行设置断点,就可以通过偏移量来达到快速设置断点的目的

        测试代码:

#include <iostream>
#include <thread>
#include <chrono>
using namespace std;void test() {cout << "enter test()" << endl;cout << "quit test()" << endl;
}void test(int) {cout << "enter test(int)" << endl;cout << "quit test(int)" << endl;
}void test(double) {cout << "enter test(int)" << endl;cout << "quit test(int)" << endl;
}void test_func() {cout << "enter test_func()" << endl;cout << "quit test_func()" << endl;
}int main() {int temp;cin >> temp;while (temp < 100) {cout << "temp: " << temp++ << endl;this_thread::sleep_for(chrono::milliseconds(500));}return 0;
}
# b <func_name># 此时,只会对class中的test_func和test_func(int)两个函数设置断点
b class::test_func()
b test_func(int)

# rb <regex>rb test_func* # 这样就为所有以test_func开头的函数设置了断点


查看、禁用、删除断点

命令功能
i b(info breakpoints / info break)查看所有断点
i b <id>查看某一个断点
disable/enable <id>禁用/启用断点
disable <id1 - id2>禁用id1到id2号断点
enable once <id>启动一次断点
enable delete <id>启动断点,在断点被击中后删除
enable count <times> <id>启动断点,在该断点被击中times次后自动禁用
ignore <times> <id>忽略前times次击中断点
delete / clear删除所有断点(clear 无法删除观察点和捕获点)
delete <id>删除断点
delete <id1 id2 ......>删除id1、id2、......号断点
delete <id1 - id2>删除id1到id2号断点
delete <id1 - id2 id3 - id4 ......>删除id1到id2、id3到id4、......号断点
clear <func_name>删除函数内所有的断点,如果存在同名函数,那么所有同名函数中的断点都会被删除
clear <filename:line>删除文件中某一行的断点

查看、修改变量

查看变量

查看变量
命令功能
show args查看命令行参数
info(i) args查看函数参数,参数必须要有名字才能查看
i locals查看局部变量
print(p) <variable>查看变量的值

set print null-stop

设置字符串的显示规则,查看字符串变量时到''0'停止
set print pretty设置结构体显示规则,让结构体中每个字段占一行
set print array on设置数组显示规则,让数组中的每个元素各占一行
p <gdb内置函数>如 sizeof,strlen,strcpy

        测试代码: 

#include <iostream>
using namespace std;void test1(int, double, const char*) {cout << "enter test(int, double, const char*)" << endl;cout << "exit test(int, double, const char*)" << endl;
}void test2(int i, const char* str) {cout << "enter test2(int i, const char* str)" << endl;cout << "exit test2(int i, const char* str)" << endl;
}int main() {test1(114514, 79856.33, "hello");test2(222222, "world");return 0;
}


修改变量

命令功能
print/p <variable> = <val>修改包括普通变量,成员变量,结构体,类等,可以用来控制程序的执行流程
p <gdb内置函数>通过调用gdb内置函数来修改变量 p strcpy(str, "this is string")


查看、修改内存

# 查看内存
# n 是显示内存的长度,以f和u的读取方式显示n个数据
# f 是显示格式(x是十六进制,d是十进制,u是无符号十六进制,o是八进制,t是二进制,f是浮点,s是字符串)
# u 是单位(b是单字节,h是双字节,w是四字节,g是八字节)
# nfu都可省略 n省略时默认为1,f省略时为你上一次指定的格式(如果没有则为x),u省略时为你上一次指定的单位(如果没有则为w)x /nfu  <addr># 修改内存
# var可写可不写,写了是为了避免set与其他单词组成命令
# 如set width就是gdb内置命令
set(var)<addr> = <value>


寄存器的查看和修改

        寄存器的查看和修改一般用在无调试符号的程序中(release版本)。

查看寄存器

命令 功能
i registers查看所有通用寄存器
i all-registers查看所有寄存器
i r <name>查看某一个寄存器

        当函数的参数小于等于6个时,会将参数放在寄存器中,否则会放入函数栈中

        如果查看的寄存器中的值是一个字符串,可以结合p (char*) <addr> 来查看其中的内容


修改寄存器

命令功能
i line <行号>查看行号对应代码的汇编地址
disassemble反汇编
set var $pc/rip = <addr>pc/rip(program counter)寄存器,用来保存程序中下一条要执行的指令,可以通过修改pc/rip寄存器来改变程序执行的流程
p $pc/rip = <addr>同上


源代码的查看和管理

命令功能
list / l显示源代码,第一次默认显示10行(前后各5行),之后每次都向后显示10行
l -向前显示
list <dir> : <line>查看指定文件指定行代码
set listsize <value>设置每次显示的行数
list <name>查看指定函数的代码,如果有同名函数,就会把所有同名函数显示出来。
可以添加域限定符::来指定显示哪一个同名函数
可以通过添加<dir> : <func name>来限定查看哪一个文件中的函数
search <regex>从当前行开始向后搜索第一个满足正则表达式的源代码,搜索到之后按回车表示以当前正则表达式继续搜索下一个
forward-search <regex>同search <regex>
reverse-search <regex>从当前行开始向前搜索第一个满足正则表达式的源代码,搜索到之后按回车表示以当前正则表达式继续搜索下一个
show directories查看源代码的查找目录,一般是程序的工作目录和当前所在目录
directory <path>设置源代码的查找目录


函数调用栈管理

命令功能
backtrace/bt查看栈回溯信息
frame/f <frame id / frame addr>切换栈帧
info f <id>查看栈帧信息

        这些命令用来检查死锁、无限递归等问题。

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

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

相关文章

linux环境下通过源码编译的方式安装mysql8.0.16版本

文章目录 前言一、资源准备1.源码下载2.依赖命令安装2.1 安装依赖包2.2 安装高版本gcc2.3 安装高版本cmake 二、编译安装mysql1.解压mysql-boost-8.0.16安装包2.执行编译命令3.执行make命令4.执行make install 命令5.编译安装完成后结果检查 三、初始化mysql1. 创建数据相关目录…

在ubuntu16.04下使用词典工具GoldenDict

前言 本来要装有道词典&#xff0c;结果发现各种问题&#xff0c;放弃。 网上看大家对GoldenDict评价比较高&#xff0c;决定安装GoldenDict 。 安装 启动 添加词库 GoldenDict本身并不带词库&#xff0c;需要查词的话&#xff0c;必须先下载离线词库或者配置在线翻译网址才…

SQL每日一练-0816

今日SQL题&#xff1a;计算每个项目的年度收入增长率 难度系数&#xff1a;&#x1f31f;☆☆☆☆☆☆☆☆☆ 1、题目要求 计算每个项目每年的收入总额&#xff0c;并计算项目收入环比增长率。找出每年收入增长率最高的项目。输出结果显示年份、项目ID、项目名称、项…

OD C卷 - 查找一个有向网络的头节点和尾节点

查找一个有向网络的头节点和尾节点 &#xff08;200&#xff09; 在一个有向图中&#xff0c;有向边用两个整数表示&#xff0c;第一个整数表示起始节点&#xff0c;第二个整数表示终止节点&#xff1b;图中只有一个头节点&#xff0c;一个或者多个尾节点&#xff1b;图可能存…

RTX 40全系10款显卡《黑神化:悟空》测试:打开DLSS3帧生成 性能直翻4倍

一、前言&#xff1a;《黑神话&#xff1a;悟空》临近发布 RTX 40系显卡表现如何&#xff1f; 2020年8月20日&#xff0c;游戏科学发布了《黑神话&#xff1a;悟空》的首个实机演示预告&#xff0c;惊艳了整个游戏行业&#xff01; 以往&#xff0c;很多人认为国产开发商做不出…

华为数通方向HCIP-DataCom H12-821题库(更新单选真题:1-10)

第1题 1、下面是一台路由器的部分配置,关于该配置描述正确的是? [HUAWEllact number 2001 [HUAWEl-acl-basic-2001]rule 0 permit source 1.1.1.1 0 [HUAWEl-acl-basic-2001]rule 1 deny source 1.1.1.0 0 [HUAWEl-acl-basic-2001]rule

Java实现STL中的全排列函数next_permutation()

目录 一、引言 二、全排列函数next_permutation() 三、next_permutation()的使用 四、Java实现next_permutation() 五、使用next_permutation()实现全排列 一、引言 相信很多小伙伴们都做过全排列的算法题&#xff0c;输入一个n&#xff0c;输出1~n的全排列。对于这个问题…

jemeter压力测试入门

1. 安装jemeter的压缩包并且解压 点击运行 2. 添加线程组 3. 线程组的参数设置 4. 添加http请求 5. 填写请求信息 添加监听器——结果树&#xff08;结果&#xff09;&#xff0c;聚合报告&#xff08;吞吐量报告&#xff09; 6. 通过cvs数据文件设置&#xff0c;配置元件&…

ARM 裸机与 Linux 驱动对比及 Linux 内核入门

目录 ARM裸机代码和驱动的区别 Linux系统组成 内核五大功能 设备驱动分类 内核类型 驱动模块 驱动模块示例 Makefile配置 命令 编码辅助工具 内核中的打印函数 printk 函数 修改打印级别 ​编辑 打印级别含义 驱动多文件编译 示例 模块传递参数 命令行传递参数…

jmeter简单发送接口

一、安装jmeter 拥有java环境&#xff0c;再下载jmeter 安装之后解压到本地&#xff0c;jmeter中的bin目录配置到环境变量中 之后可以通过cmd中 jmeter.bat命令运行 二、利用jmeter发送接口请求 1、添加线程组 添加->线程->线程组 2、添加http请求 添加->取样器-&g…

利用Matlab求解高阶微分方程(ode45)

1、高阶微分方程的基本概念 二阶以及二阶以上的微分方程称之为高阶微分方程&#xff0c;一般来说&#xff0c;微分方程的阶数越高&#xff0c;求解的难度也就越大。求高阶方程的一个常用方法就是降低阶数。对二阶方程 &#xff0c;如果能用变量代换把它化成一阶方程&#xff0c…

学习记录——day33 HTTP

目录 一、HTTP相关概念 二、客服端请求 1、请求首部 2、 响应首部 三、线程实现HTTP并发服务器 一、HTTP相关概念 1、HTTP&#xff0c;全称Hyper Text Transfer Protocol&#xff0c;用于万维网&#xff08;world wide web&#xff09;进行超文本学习的传输协议 2、HTTP属…

计算xpclr

1.conda安装xpclr 首先安装流程很轻松 conda create -n xpclr -c bioconda xpclr conda activate xpclr xpclr -h 2.按照要求准备文件 XPCLR - 简书 (jianshu.com) 根据教程准备文件&#xff0c;vcf&#xff0c;计算好的map&#xff0c;以及样本文件txt 其实官网也有介绍…

Docker基础概述、Docker安装、Docker镜像加速、Docker镜像指令

1.为什么学docker 开发环境与测试环境不同&#xff0c;导致错误 因此docker提供解决方法———系统平滑移植&#xff0c;容器虚拟化技术 将代码与软件与配置文件 打包成一个镜像 2.docker的历练 创建一个开发环境内成为镜像文件再用docker使用镜像 3.什么是docker Docke…

MySQL5.7数据库---入门教程(小白教程)

一、MySQL安装 本文以MySQL5.7安装为例。在设置完root密码和添加一个用户后&#xff0c;一路默认。 1、 2、通过点击红圈里的箭头选择对应的版本。 3、 4、端口&#xff08;Port&#xff09;一般默认不需要更改。 5、 二、配置环境变量 配置环境变量可以方便在win系统中cmd…

流媒体服务器二 3学习 librtmp 库的配置使用

librtmp 库是个啥&#xff1f; librtmp是一个开源的基于C语言的库&#xff0c;提供了一个连接RTMP服务器&#xff0c;发送和接收RTMP流的API。 它可以用来开发流媒体播放器&#xff0c;网络直播等应用。它的主要特点是快速、稳定和低延迟。 librtmp支持RTMP&#xff0c;RTMPS…

Qt第十七章 多线程

文章目录 多线程1. 线程概念的起源2. 三种方式创建线程3. 启动线程前的准备工作4. 启动线程/退出线程5. 操作运行中的线程6. 为每个线程提供独立数据7.子线程不能操作ui解决方案 多线程 1. 线程概念的起源 单核CPU 早期还没有线程的概念&#xff0c;如何保证2个进程同时进行呢…

基于Java爬取微博数据(四) 获取 图片 or 视频

基于Java爬取微博数据四 获取 图片 or 视频 图片 or 视频转存 图片 or 视频注意点 前面已经讲述了基于 Java 爬取微博正文列表内容&#xff0c;微博用户主页内容以及导出爬取到的微博数据等操作&#xff0c;那么下面讲述一下如何处理微博正文中的图片/视频等内容。 图片 or 视…

(转载)使用zed相机录制视频

参照下面这个链接 https://blog.csdn.net/peng_258/article/details/127457199?ops_request_misc&request_id&biz_id102&utm_termzed2%E5%BD%95%E5%88%B6%E6%95%B0%E6%8D%AE%E9%9B%86&utm_mediumdistribute.pc_search_result.none-task-blog-2~all~sobaiduweb…

代码复现改进

代码复现&#xff0c;文献复现&#xff0c;文章复现&#xff0c; 算法复现&#xff0c;科研复现 Matlab,Python中英文均可 保证质量&#xff0c;加快你的研究速度 代码改进跑通&#xff0c;模型优化改进