变量查看与修改
在使用 GDB 调试程序时除了控制程序的运行流程以外最常见的操作就是查看变量的值、查看参数的值以及在调试过程中临时修改某些变量的值。通过这些命令可以观察程序运行时的数据变化从而判断程序逻辑是否符合预期。1.1 查看函数参数使用info args(i args)命令可以查看当前函数传入参数的值包括main函数的argv与argc参数。i args例如当前程序停在某个函数内部void test(int a, int b) { int sum a b; }在断点处执行i args就可以看见传入的a和b变量的值除了使用i args也可以直接使用print(p)命令打印某个参数的值p a p b1.2 查看变量1、查看普通变量在 GDB 中可以使用print命令查看变量的值print可以简写为p。p [变量名]例如p num p ch默认情况下p命令会按照变量本身的类型打印结果。如果想按照不同格式查看变量可以在p后面加格式控制。常见格式如下命令含义p/d var按十进制打印p/x var按十六进制打印p/t var按二进制打印p/o var按八进制打印p/c var按字符打印p/s var按字符串打印例如p/d num p/x num p/t num p/c ch如果有如下代码int num 65; char ch A;执行p/d num p/x num p/c num可能得到$1 65 $2 0x41 $3 65 A这样可以方便地从不同角度查看变量的值。2、查看变量类型如果想查看变量的类型可以使用如下命令ptype [变量名]ptype显示的信息详细适合查看结构体、指针、数组等复杂类型。例如有如下结构体定义struct Student { char name[32]; int age; }; struct Student stu {Tom, 18}; struct Student *pstu stu;在 GDB 中可以执行ptype stu可能得到type struct Student { char name[32]; int age; }这说明变量stu的类型是struct Student并且 GDB 会把结构体中的成员也显示出来。如果查看结构体指针变量ptype pstu可能得到type struct Student *这说明pstu是一个指向struct Student类型的指针。如果想查看指针指向的对象类型也可以对指针解引用后再查看ptype *pstu可能得到type struct Student { char name[32]; int age; }在调试结构体、链表、树、数组指针等复杂数据结构时ptype非常有用可以帮助我们快速确认变量的数据类型以及内部成员组成。whatis命令可以用来查看结构体类派生类普通函数以及类成员函数ptype命令可以更加详细的查看这些内容如果显示一个类ptype会把类的成员变量和成员函数都显示出来i variables命令用来查看全局变量或者静态变量比如我们看见一个变量使用但是不知道该变量是在哪定义的就可以使用这个命令ptype /m //只显示成员变量不显示成员函数 ptype /t //不现实typedef的内容 ptype /o //显示结构体或者类的内存构造以及大小例如如果我们对结构体占用内存大小进行优化可以使用ptype命令对结构体进行查看查看他对内存空间的利用率(gdb) ptype /o node /* offset | size */ type struct NODE { /* 0 | 4 */ int ID; /* 4 | 4 */ int age; /* 8 | 1 */ char gender; /* XXX 7-byte hole */ /* 16 | 8 */ NODE *next; /* 24 | 4 */ int test; /* 28 | 1 */ char c; /* XXX 3-byte padding */ /* total size (bytes): 32 */ }可以看见对于上面的结构体所有成员直接加起来才22个字节但是使用不合理的排布之后会用32个字节才能存下调整结构体之后可以优化内存布局到24个字节(gdb) ptype /o node2 /* offset | size */ type struct NODE2 { /* 0 | 4 */ int ID; /* 4 | 4 */ int age; /* 8 | 8 */ NODE *next; /* 16 | 4 */ int test; /* 20 | 1 */ char gender; /* 21 | 1 */ char c; /* XXX 2-byte padding */ /* total size (bytes): 24 */ }i variables 变量的正则表达可以查看对应的变量是在哪个文件中定义的。1.3 查看数组、字符串、结构体和指针1、查看数组对于普通数组可以直接打印数组名p arr也可以查看数组中的某一个元素p arr[0] p arr[1]如果是指针指向一段连续内存可以使用下面的方式查看多个元素p *ptr10这表示从ptr指向的位置开始连续打印 10 个元素。例如int arr[5] {1, 2, 3, 4, 5}; int *ptr arr;在 GDB 中执行p *ptr5可能输出$1 {1, 2, 3, 4, 5}2、查看字符串直接通过p [字符串变量名称]命令就可以显示查看字符串。查看字符串变量的时候如果字符串为100个字符串填充了10个字符之后后面的字符全为0这时候显示字符串的时候就不是很好看使用以下命令设置输出显示格式set print null-stop例子如下在没有设置显示格式之前可以看见打印的test.name会因为\0的问题出现显示问题。设置字符串显示格式之后可以看见对应的字符串在应该结束的地方断开。3、查看结构体变量如果是结构体变量可以直接打印p student如果只想查看结构体中的某个成员可以使用p student.name p student.age例如struct Student { char name[32]; int age; }; struct Student stu {Tom, 18};在 GDB 中可以执行p stu p stu.name p stu.age使用以下命令可以使得在直接打印结构体变量的时候可以让结构体的每一个成员独占一行set print pretty4、查看指针如果变量是结构体指针需要使用-访问成员p node-data p node-next如果想查看指针指向的整个结构体内容可以使用p *node这在调试链表、树、队列等数据结构时非常常用。1.4 查看局部变量使用info locals(i locals)命令可以查看当前函数中的局部变量。i locals例如void test(int a, int b) { int sum a b; int count 100; }当程序停在test函数内部时执行i locals会把当前函数中的所有局部变量的值打印出来sum 30 count 1001.5 表达式与函数调用在GDB中p命令不仅可以打印普通变量也可以计算表达式的值甚至可以调用程序中的函数或库函数。例如可以使用sizeof查看类型或变量所占的字节数p sizeof(int) p sizeof(long) p sizeof(char *) p sizeof(变量名)如果程序中有如下变量int num 10; char name[32] hello;在 GDB 中执行p sizeof(num) p sizeof(name)可能得到$1 4 $2 32其中sizeof(num)表示变量num所占的字节数sizeof(name)表示整个数组name所占的字节数。除了sizeof也可以在 GDB 中调用一些函数例如strlenp strlen(name)如果name中保存的是字符串hello执行结果可能是$3 5这表示字符串的有效长度为 5不包含字符串结尾的\0。1.6 修改变量在 GDB 调试过程中不仅可以查看变量的值也可以临时修改变量的值。修改变量常用于验证程序逻辑例如让程序进入某个特定分支、提前结束循环或者人为设置某些异常条件从而观察程序后续的执行情况。例如在调试for循环时可以临时修改循环变量的值让循环提前结束在调试if判断时也可以修改条件变量的值让程序进入不同的分支。在实际调试中比较常用的方式是直接使用p命令执行赋值表达式p [arg][vaule]

相关新闻

LeetCode 984.不含AAA或BBB的字符串

LeetCode 984.不含AAA或BBB的字符串

给定两个整数 a 和 b ,返回 任意 字符串 s ,要求满足: s 的长度为 a b,且正好包含 a 个 ‘a’ 字母与 b 个 ‘b’ 字母; 子串 ‘aaa’ 没有出现在 s 中; 子串 ‘bbb’ 没有出现在 s 中。 示例 1&#xff1…

2026/7/8 2:06:25阅读更多 →
测试转大模型:上线前最该检查的几件事

测试转大模型:上线前最该检查的几件事

这篇我按“先跑起来、再讲取舍”的方式写《测试转大模型:上线前最该检查的几件事》。概念会讲,但重点放在代码怎么组织、哪里容易踩坑。 摘要 先把这篇文章的目标说清楚:看完之后,你应该能判断这件事值不值得做,以及…

2026/7/8 2:01:24阅读更多 →
Docsify小试牛刀

Docsify小试牛刀

前置安装环境: npm i docsify-cli -g 安装docsify cli客户端;初始化项目目录: docsify init . ,这会在当前目录下创建工作目录,默认有:index.html : 整站是一个单页面静态页面README.md: 默认的…

2026/7/8 2:01:24阅读更多 →
面向多场景选型参考:2026年仓库管理系统功能特点梳理

面向多场景选型参考:2026年仓库管理系统功能特点梳理

仓储物流行业的不同业态运营主体,对仓库管理系统的关注点存在差异,例如部署成本、库存可视性、策略配置灵活性、系统集成度等方面。面向第三方物流、制造企业仓储、快消品及生鲜冷链等场景,市场上已有多种系统方案可供选择。以下为部分系统的…

2026/7/8 3:06:30阅读更多 →
《深入理解计算机系统》信息的表示和处理

《深入理解计算机系统》信息的表示和处理

《深入理解计算机系统》第2章“信息的表示和处理”是全书的基础,它揭示了计算机如何用二进制位表示现实世界中的数字、字符、指令等,并解释了不同编码方式带来的数学特性和潜在陷阱。以下是对该章核心内容的梳理。 1. 信息存储的基本单元与十六进制表示 …

2026/7/8 3:06:30阅读更多 →
5分钟搞定iPhone USB网络共享:Windows用户的终极解决方案

5分钟搞定iPhone USB网络共享:Windows用户的终极解决方案

5分钟搞定iPhone USB网络共享:Windows用户的终极解决方案 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目地址: https://gitcode.com/gh_…

2026/7/8 3:06:30阅读更多 →
分析烘焙行业原料成本管理难点及解决方案

分析烘焙行业原料成本管理难点及解决方案

一、烘焙行业原料成本管理的核心难点烘焙行业因原料特性、生产工艺、经营模式的特殊性,原料成本管理一直是门店盈利的“拦路虎”,核心难点集中在以下4点,也是导致利润流失的主要原因:(一)配方与投料不规范&…

2026/7/8 3:06:30阅读更多 →
高校人工智能实训室建设找哪家?深度解析与选择指南

高校人工智能实训室建设找哪家?深度解析与选择指南

随着"人工智能"战略的深入推进,越来越多的高校将AI实训室建设列入重点工程。然而,面对市场上参差不齐的服务商,如何选择一家真正能落地的合作伙伴,成为许多高校教务管理者的核心困惑。本文从需求分析、选型维度、市场现…

2026/7/8 3:06:30阅读更多 →
计网-哪些情况网络设备会发送广播报文

计网-哪些情况网络设备会发送广播报文

哪些情况会使用广播报文 情况1:动态主机配置与网络初始化 (DHCP) 在企业园区网或数据中心中,成百上千台终端(PC、AP、IP电话)接入网络时,不可能手动配置IP。 业务场景:新设备接入网络时,处于“零…

2026/7/8 3:01:30阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/7 4:43:43阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/7 2:56:31阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/8 2:26:06阅读更多 →
作为一个给团队打绩效的人,我想说几句

作为一个给团队打绩效的人,我想说几句

我每半年都会给团队成员打绩效,也会参与和 CTO 的绩效校准,所以从管理者的视角,说说这件事 首先,我先把结论告诉你:接受结果,但一定要把原因问清楚。 因为当绩效公布到你这里的时候,结果基本已…

2026/7/8 0:01:17阅读更多 →
A股股指期货:全维度解析(多表格结构化完整版)

A股股指期货:全维度解析(多表格结构化完整版)

一、基础定义与核心本质股指期货全称股票价格指数期货,是中国金融期货交易所(中金所)上市的标准化金融期货合约,交易标的为 A 股大盘指数,约定未来特定时间按约定价格现金交割指数涨跌差价,不交割一篮子股票…

2026/7/8 0:01:17阅读更多 →
iOS越狱新手指南:从困惑到掌控,3天解锁iPhone无限潜能的真实故事

iOS越狱新手指南:从困惑到掌控,3天解锁iPhone无限潜能的真实故事

iOS越狱新手指南:从困惑到掌控,3天解锁iPhone无限潜能的真实故事 【免费下载链接】Jailbreak iOS 26.4 - 26, 17 - 17.7.5 & iOS 18 - 18.7.3 Jailbreak Tools, Cydia/Sileo/Zebra Tweaks & Jailbreak News Updates || AI Jailbreak Finder &…

2026/7/8 0:01:17阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/7 5:11:21阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/7 5:11:21阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/7 5:11:21阅读更多 →