GDB 奇技淫巧

news/2025/3/18 10:46:43/文章来源:https://www.cnblogs.com/yiming564/p/-/GDB_tricks

GDB 奇技淫巧

本文面向读者为使用 NOI Linux 的 OIer,因此只介绍 OIer 可能会使用到的功能,对于工程上的功能不会讲述。


今天是 \(\text{CSP-S 2024 Day 0}\),不知道有没有人因为平时依赖 vscode,担心考场上没有合适的调试器呢。

笔者就是这样一个 Joker,但是没有关系,NOI Linux 没有 vscode 插件,我们有 GDB!

GDB 基础运用

你可能以为,GDB 只是一个简陋的 CLI 调试工具,但事实上只需简单的调教和学习,你就可以把它玩出花来。

下面收录了一些 GDB 常用的基础命令(及其简写)

  • start:启动程序并停止在第 \(1\) 行。
  • break[b] x:在第 \(x\) 行设置断点。
  • break[b] x if cond:在第 \(x\) 行设置条件断点断点,当 cond 值为真时触发。
  • run[r]:运行程序
  • continue[c]:在断点处继续运行。
  • info local:查看局部变量。
  • next[n]:单步执行,跳过函数调用。
  • step[s]:单步执行,进入函数调用。
  • finish:结束当前函数。
  • backtrace[bt]:查看函数调用栈。
  • frame[fr]:切换栈帧以查看该栈帧中的局部变量和参数等。
  • display x:持续打印变量。
  • print[p] x:打印变量(一次性)。
  • delete:删除断点,监视点,display 等。
  • list:显示当前运行到的一段代码。

更详细的介绍可以参见 GDB 备忘清单 一文,此处不再赘述。

GDB 高级运用

.gdbinit

在你的用户目录下建立 ~/.gdbinit,它可以在你的 GDB 运行前预输入你自定义的命令。先建立起来,我们后续有用。

TUI 模式

只要给 GDB 传入参数 -tui 就可以打开文本用户界面,这是我们唯一的武器!

使用 TUI 模式,我们可以方便地分屏预览源代码和命令行,并可视化地看到程序运行到了哪里,断点于何处,一切难题迎刃而解!

首先,打开你的 vscode。尽管它只是一个文本编辑器了,但它还可以内置终端,其他软件连这个功能都没有。

给你的程序写好 freopen,并使用 setvbuf(stdout, NULL, _IONBF, 0); 关闭输出缓冲区,这会使你的标准输出的每一个字符被直接写入文件内。这样,在调试的时候,我们直接打开输出的文件,在 vscode 里预览即可。

下面是一个测试程序:

#include <bits/extc++.h>#define inline __always_inline
template <typename T> inline void read(T &x)
{char ch;for (ch = getchar(); !isdigit(ch); ch = getchar());for (x = 0; isdigit(ch); ch = getchar())	x = x * 10 + (ch - '0');
}int main()
{freopen64("out", "w", stdout);setvbuf(stdout, NULL, _IONBF, 0);for (int i = 0; i < 10; i++)printf("Test\n");return 0;
}

为什么要输出到文件这样多此一举?因为 GDB 的 TUI 模式使用 curses 这个库实现,如果再有标准输出会打乱原先文本界面的阵形,导致界面混乱。

然后你可以使用 g++ main.cpp -o main -g 编译你的源文件,并使用 gdb -tui ./main 来试着调试一下,相信你一定很容易学会如何使用。

下图是笔者在 vscode 中调试的实际界面,还是比较人性化的,属于人类可用的范围。

在使用 NOI Linux 时可能没有代码高亮(笔者使用的是 WSL 有代码高亮),但这无伤大雅。

普通效果


当然,你可能会觉得上下结构的窗口结构浪费屏幕空间,没关系!打开 ~/.gdbinit,输入如下内容:

# 定义新窗口布局为左右布局,src 与 cmd 1:1 分屏。
tui new-layout noi-linux {-horizontal src 1 cmd 1} 1 status 0
# 更改为我们自定义的窗口布局
layout noi-linux
# 更改窗口焦点到 cmd(默认在 src)
focus cmd
# 更改代码的 tab 大小(个人喜好)
set tui tab-width 4

然后重新运行 GDB,如果显示异常就略微改变窗口大小,这样就可以左右分屏了,效果如下:

自定义效果


最后,介绍一下 TUI 模式的一些基本的快捷键:

基本快捷键:

  • Ctrl + x o:更改窗口焦点。
  • Ctrl + x s:进入单键命令模式。
  • Ctrl + l:刷新窗口。

单键命令模式:

  • c:断点处继续执行。
  • f:结束当前函数。
  • n:单步执行(跳过函数调用)。
  • s:单步执行(进入函数调用)。
  • v:查看栈变量。
  • w:查看调用栈。
  • q:退出单步调试模式。

GDB CLI 模式的正常的调试命令同样可用。


最后,祝各位 \(\text{CSP-S 2024 rp++}\),调试一遍过!

本文是笔者在考试前一天花一个小时赶工的,可能略有粗糙和纰漏,各位看官老爷如发现错误,可于评论区指出。

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

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

相关文章

py网络工具编程

从各项网络协议开始了解 分析其用途以及攻击价值 通过py构造数据包自动化的实现攻击过程 scapy模块: 该模块非常强大 可以构造绝大部分数据包:上图构造了一个tcp的数据包 其分片为零 协议为tcp再次构造一个数据包 通过调用show()查看默认构造数据包结构如何对数据包的属性值进…

半导体测试行业的相关术语

ATE = Automatic Test Equipment. 是自动化测试设的缩写,于半导体产业意指集成电路(IC)自动测试机, 用于检测集成电路功能之完整性, 为集成电路生产制造之最后流程, 以确保集成电路生产制造之品质。DUT = Device Under Test. 待测设备,半导体行业一般是电子元器件/芯片。P…

Go 实现 LRU 和 LFU

0. 前言 缓存是一个非常大的 topic。常用的缓存算法有 LRU(Latest Recently Used)最近最少使用和 LFU(Latest Frenquency Used)最不经常最少使用算法。 本文会介绍这两种算法,并且给出缓存使用的一些介绍。 1. LRU 首先,LRU 是最近最少使用算法,根据时间的顺序淘汰最久没…

高级语言程序设计第四次作业

一开始没注意题目要求写错了我的写法有点麻烦不知道能不能更简便一开始把循环条件给写错了写了好久才找出来一开始的改正的不对,而且赋值会出现错误;这题没有遇到什么问题一开始不会用getchar想了好久这下面的几题这题不知道为什么前一个数输出了一个负数,但是却不影响结果这…

windows无法访问共享电脑怎么办

当Windows无法访问共享电脑时,您可以采取以下措施:1. 检查网络连接和设置;2. 校验文件和打印机共享设置;3. 考虑网络发现设置;4. 重新配置防火墙规则;5. 检查用户帐户和权限设置。在共享过程中,确保系统和网络配置正确是至关重要的。1.检查网络连接和设置 当Windows无法…

机器视觉的主要功能分别是什么

机器视觉的主要功能包括图像采集、图像处理与分析、特征提取、物体识别与分类、三维重建、以及动作控制和决策输出。其中,特征提取是关键步骤,通常用于识别物体的不同属性,如形状、颜色或纹理。这些功能合作,使机器视觉系统能够模拟人类视觉进行信息处理,并用于各种应用场…

软件开发与测试模型

软件开发模型软件开发生命周期模型是软件产品从最初构思到退役的过程。常见的软件开发模型 大爆炸模型直接开发(有想法直接编程无计划性)。边写边改模型变对需求进行分析边对软件进行编程。 先简单的设计来回编程来回测试来回修改直至觉得足够才发布产品。 无计划与文档可以迅…

第9课—项目管理工具禅道

一、禅道的介绍 (1)定义禅道是一个项目管理工具,也是一个bug管理工具,还是一个用例管理工具。 (2)作用:为了解决众多企业在管理中出现混乱,无序的现象,开发出来 (3)来源:禅道属易软天创公司 (4 )禅道是集于产品管理,项目管理,测试管理于一身,同时包含事务管理…

求中位数应经常联想到二分

题目链接:https://codeforces.com/contest/2008/problem/H首先想了一会,随后想到了取模,但是由于这个q太大于是考虑是否可以实现动态变化最后还是没得出结果,遂看了题解。 原来这道题由于n的限制,所以可以对求出取模所对应的余数的取模区间 \([k*x,k*x+m]\),于是复杂度到…

IDEA如何配置Java环境,jdk路径

前言 我们在使用IDEA开发Java应用时,一般第一步就是需要配置好我们的jdk环境,并且在IDEA里面配置jdk的安装路径。 那么,我们应该如何配置呢? 如何配置jdk路径 首先,我们点击【File】,再点击【Project Structure】。然后,我们点击下【Project】,点击【Edit】,选择jdk的…

IAP在线升级二

一.分析JumpToApp函数点击查看代码 void JumpToApp(uint32_t addr) { __disable_irq();//这个函数调用会禁用中断。在跳转到新的应用程序之前,通常需要确保当前的中断状态不会干扰跳转过程。uint32_t sp = *((volatile uint32_t *)(addr));//从addr指定的地址读取栈指针(Stac…

动态语言有哪些

在开头段落,请允许我一句言归正传地回答这个问题:动态语言主要有Python、JavaScript、Ruby、Perl、PHP和Groovy等。这类语言的主要特点是它们在运行期间能够改变其结构,如新的函数、对象、甚至代码可以被引入,已有的函数可以被删除或其他结构上的改变。这使得动态语言在写代…