GDB的基本使用(1)

news2024/11/29 4:05:12

我有话说

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


启动调试与程序执行

启动调试并传递参数

命令(这三者在功能上没有任何区别 )功能
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.coloradmin.cn/o/2062251.html

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

相关文章

小白快速上手 SRC漏洞挖掘科普攻略!零基础入门到精通,收藏这一篇就够了

前言 随着网络安全的快速发展&#xff0c;黑客攻击的手段也越来越多样化&#xff0c;因此SRC漏洞挖掘作为一种新的网络安全技术&#xff0c;也在不断发展和完善。那么&#xff0c;作为一个网安小白如果想要入门SRC漏洞挖掘&#xff0c;需要掌握哪些知识呢&#xff1f;以下是本…

css属性 clip-path切割多边形polygon

如果我们要把一个矩形切割成如图所示&#xff0c;可以使用 clip-path来做切割 clip-path&#xff1a;polygon&#xff08;x1 y1&#xff0c;x2 y2&#xff09;里面的参数是切割后每个顶点的坐标&#xff0c;坐标的原点是div的左上角&#xff0c;每个顶点的坐标如下&#xff1a…

海山数据库(He3DB)源码详解:事务源码执行过程

海山数据库(He3DB)源码详解&#xff1a;事务源码执行过程 本文介绍了He3DB数据库在DDL和DML操作过程中&#xff0c;两种事务在底层源码执行流程细节。 操作过程 1、启动数据库并进入GDB 首先&#xff0c;在终端A启动一个测试用的数据库test&#xff0c;并查看当前测试用的t…

【Qt】输入类控件QLineEdit

目录 输入类控件QLineEdit 例子&#xff1a;录入个人信息 例子&#xff1a;使用正则表达式验证输入框的数据 例子&#xff1a;验证俩次输入密码一致 例子&#xff1a;切换显示代码 输入类控件QLineEdit QLineEdit 用来表示单行输入框&#xff0c;可以输入一段文本&#xf…

ubuntu18.04更改系统语言及换源的方法步骤

ubuntu的虚拟机不知道第几次被玩崩溃了&#xff0c;无奈只好重装&#xff0c;这里记录下更改语言和换源的操作步骤。 一、更改系统语言为简体中文 1&#xff0c;点击虚拟机右上角的开始按钮&#xff0c;选择设置。 2&#xff0c;在左侧选项中选择Region & Language,再选择…

day28-测试自动化之Requests库的发送请求、响应内容、Cookie和session

目录 一、发送请求 1.1.GET请求 1).作用 2).步骤 3).响应对象 4).代码 5).带参代码 1.2.POST请求 1).作用 2).应用 3).参数 4).代码&#xff08;地址已失效&#xff09; 5).扩展 1.3.PUT请求 1).作用 2).应用 3).参数 4).响应 5).代码&#xff08;地址已失效&#xff09; 1.4.D…

DC-2综合渗透,rbash逃逸,git提权,wordpress靶场渗透教程

前言 博客主页&#xff1a;【h0ck1r丶羽】的公众号~~ ​ 本文主要讲解了渗透测试中的完整渗透测试流程&#xff0c;主要介绍了【wpscan】、【cewl】、【rbash逃逸】的使用技巧&#xff0c;靶场为vulnhub的机器大家可以自行下载&#xff0c;如果文章哪有不对&#xff0c;还请师…

大模型在应用开发安全左移实践

1.应用开发安全左移势在必行 近年来&#xff0c;应用系统被入侵或敏感信息泄漏类的安全事件时有发生&#xff0c;大部分安全事件的根本原因是应用软件设计或实现中存在安全漏洞。由于软件安全性问题导致各种信息泄密、信息被篡改、网络服务中断的事件频发&#xff0c;给企业和…

如何基于 langchain与 LLM 构建自己的知识库系统

如何基于 langchain与 LLM 构建自己的知识库系统 前些时候字节上了自己的扣子&#xff0c;用来构建我们自己的 agent AI 实战&#xff1a;手把手教你使用「扣子/coze」来搭建个人blog知识库 - 掘金 (juejin.cn)[1] 受到启发&#xff0c;想在本地或者自己的服务器上面搭建一个知…

机器学习第五十二周周报 Distribution Shift of GNN

文章目录 week52 Distribution Shift of GNN摘要Abstract一、文献阅读1. 题目2. Abstract3. 预测标准3.1 问题提出3.2 图结构3.3 分布转移 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程 5. 结论 二、若依框架1. 框架概述2. 核心功能 3. 技术栈4. 框架特点优缺点小结参考…

写作小白2024年逆袭,AI写作工具top4的正确打开方式

以前&#xff0c;人们总觉得写文章、编故事是人特有的本事&#xff0c;机器肯定搞不定。但现在&#xff0c;AI越来越牛&#xff0c;这些AI写作工具&#xff0c;用上了深度学习、自然语言处理这些高科技&#xff0c;能模仿人的思路来写东西。它们不仅能帮人写&#xff0c;有时候…

AI大模型日报#0822:OpenAI推GPT-4o微调服务、混元大模型负责人专访

导读&#xff1a;AI大模型日报&#xff0c;爬虫LLM自动生成&#xff0c;一文览尽每日AI大模型要点资讯&#xff01;目前采用“文心一言”&#xff08;ERNIE-4.0-8K-latest&#xff09;、“智谱AI”&#xff08;glm-4-0520&#xff09;生成了今日要点以及每条资讯的摘要。欢迎阅…

APO 集成生态exporter一键完成指标采集

Metrics 作为可观测性领域的三大支柱之一&#xff0c;Metrics数据采集显得尤为重要。传统的prometheus工具采集指标&#xff0c;需要指定路径抓取&#xff0c;当指标越来越多配置会显得复杂。同时prometheus只能采集指定的指标&#xff0c;当用户需要节点系统相关、中间件等指标…

虚幻5|制作一个木桩,含血量及伤害数字

一&#xff0c;基础设置 1.创建Actor蓝图类 2.编辑胶囊体和网格体的碰撞预设 3.打开敌人的角色蓝图&#xff0c;编辑飙血特效 二&#xff0c;创建敌人血量的ui&#xff0c;命名为敌人血量&#xff0c;如下 1. 2&#xff0c;打开后&#xff0c;添加一个画布画板和进度条&#…

为什么有了session和cookie还要使用JWT

session和cookie 为什么要使用session和cookie,他的流程是怎么样的 因为浏览器是无状态的,相当于每一次访问都是一次全新的访问,我们一般是登录来进行校验获取他的全部信息,所以会出现这个情况 这样当然也可以使用,但是很繁琐,并且影响性能,所以出现了session和cookie,他会生…

MDN边看边记

css css应用于文档的三种方法&#xff1a;使用外部样式表、使用内部样式表和使用内联样式。 css的层叠&#xff08;cascade&#xff09;和优先级&#xff08;specificity&#xff09;&#xff1a; 层叠&#xff1a; 在css中&#xff0c;顺序很重要&#xff0c;当应用两条同级…

苹果手机怎么连接蓝牙耳机?3个方案,3秒连接

在快节奏的现代生活中&#xff0c;无线蓝牙耳机因其便捷性和自由度成为了许多人的首选。那么&#xff0c;苹果手机怎么连接蓝牙耳机呢&#xff1f;本文将为您介绍3种快速连接苹果设备与蓝牙耳机的方案&#xff0c;让您在享受音乐、通话或观看视频时&#xff0c;不再受线缆束缚&…

‌无人机干扰技术及其法律约束

无人机作为一种先进的航空器&#xff0c;‌近年来在民用、‌商用、‌军事等领域得到了广泛应用。‌然而&#xff0c;‌随着无人机技术的不断发展&#xff0c;‌其受到的潜在威胁也日益增多。‌许多外部因素可以干扰无人机的正常运行&#xff0c;‌甚至导致其失控或坠毁。‌本文…

linux内核驱动流程

norflash:可线性访问(和内存的访问方式相同) nandflash: 不可线性访问&#xff0c;必须配个专门的程序访问 Linux启动: 1. 引导程序 bootloader&#xff0c;为内核启动准备环境 2.启动内核(kernel) 3. 加载根文件系统(挂载) 1.bootloader启动(裸机程序)--uboot.bin --为内…

[240822] X-CMD 发布 v0.4.7: 新增 htop 、btop 和 ncdu 模块;优化 colr 和 scoop 模块

X-CMD 发布 v0.4.7 目录 X-CMD 发布 v0.4.7&#x1f4c3;Changelog✨ htop✨ btop✨ ncdu✨ colr✨ scoop✅ 升级指南 &#x1f4c3;Changelog ✨ htop 新增 htop 模块。本模块优先使用环境中的 htop 命令&#xff1b;若当前环境没有 htop 命令&#xff0c;模块将使用 pixi 模…