格蠹信息科技有限公司
GDB · 夏训 · 查看内存
www.nanocode.com
盛格塾 2024 暑期公益课程
GDB暑假训练营
在数字编织的编程宇宙中,内存,这一无形的舞台,默默承载着数据流转。2024年8月8日,我们再次相聚于这虚拟的殿堂,不是为了简单的代码堆砌,而是为了多角度审视编程世界中最为神秘莫测的领地——内存舞台。今天,我将作为你的向导,借助GDB这一强大的调试工具,带你踏上深入内存秘境的探险之旅。想象一下,我们将直接触碰程序运行时的脉搏,窥探那些隐藏在内存深处的数据奥秘,共同揭开那些决定程序命运的细节。
随着直播拉开序幕,我带着对未知世界的好奇与敬畏,引领着每一位观众踏入了内存探索的奇幻之旅。首先,我简要回顾了GDB在变量查看中的强大功能,给大家复习了一下print和display两个命令的区别,为即将展开的内存探索之旅奠定了坚实的基础。
“在GDB中,查看内存内容的命令是x(examine的缩写)。”我边操作边娓娓道来,“通过x命令结合不同的格式选项,我们可以直接查看内存地址中的原始数据。”随着我的演示,屏幕上逐渐显现出内存区域的具体内容,让大家都能直观感受到GDB在内存查看方面的独特魅力。命令的基本格式:x /nfu add;随后,我给大家逐一解析这个命令的各个部分:首先,对于/n:用来指定了我们要查看的内存单元的数量。比如,如果你想看4个内存单元的内容,就写/4。接着,f:用来显示格式。GDB提供了多种格式来显示内存内容,以适应不同的需求。比如x:十六进制,这是最常用的格式之一,因为它可以清晰地显示内存中的字节值。然后,对于u:这部分指定了每个内存单元的大小。不同的数据类型占用不同数量的字节,因此我们需要明确告诉GDB每个单元的大小。例如,b:单字节(byte)。最后,就是addr:这是用来查看的内存地址。你可以通过GDB的其他命令(如print &variable)来获取变量的地址,或者直接输入一个已知的内存地址。紧接着,我就在屏幕上给大家举了个例子:查看数组intArray它前4个元素的内容。可以在键盘上输入:print &intArray获取数组首元素的地址。
然后,输入:x/4w address这个命令会显示从address地址开始的4个四字节内存单元的内容,每个单元都以十六进制形式显示。
然而,GDB的内存查看功能远不止于此。我进一步展示了x命令的强大之处,利用x命令查看内存的状态变化。这种查看方式,让我们能够深入理解程序在运行过程中内存的使用情况,进而发现潜在的内存泄露、越界访问等问题,为程序的健壮性保驾护航。
在直播过程中,我还分享了几个实用的GDB内存查看技巧,如使用info registers命令查看寄存器状态(因为寄存器也是内存访问的重要部分),以及如何利用GDB的x命令查看不同类型变量的内存地址。这些技巧的介绍,不仅丰富了调试的手段,也让整个调试过程更加高效、准确。
随着直播的渐入佳境,我愈发被GDB中x命令的深邃与强大所震撼。张老师以其渊博的知识和丰富的经验,引领我探索了一系列x命令的精妙组合,这些是我此前未曾触及的知识宝藏。在他的悉心指导下,我逐一输入命令,屏幕上如同魔法般显现出一幕幕内存数据的内容,每一个结果都如同解锁了程序内部的一个新秘密。
张老师还对每一个命令背后的逻辑和用途进行了详尽的剖析,这种深入浅出的讲解方式让我深感神奇之余,也极大地拓宽了我对x命令应用边界的认知。这一刻,我深刻体会到了GDB的浩瀚与神奇。
当直播步入尾声,张老师向我们介绍了一个深藏不露、唯有GDB资深高手方能知晓的绝技—— x/100ga $sp。这一命令的亮相,瞬间让这一场直播间上了一个档次,它就像是函数调用的一份履历,能够一次性解锁栈指针($sp)当前位置向下延伸的100个8字节)内存区域,让我们能够以前所未有的视角,窥探程序运行时栈帧的详细布局与数据状态。张老师的此番分享,无疑为本次GDB探索之旅画上了一个圆满而充满期待的句号,同时也激发了我们对GDB更深层次功能的无限遐想与探索欲望。
今天的直播,不仅是对GDB内存查看功能的一次深度挖掘,更是我们共同成长的见证。在探索的路上,我们学会了如何用GDB的慧眼洞察程序的内在逻辑,如何用其强大的功能为我们的编程之旅保驾护航。未来,无论是面对复杂的内存管理难题,还是深入探索程序的性能瓶颈,我相信,今天的所学所感都将是我们最宝贵的财富。让我们带着这份收获与激情,继续在编程的征途中勇往直前,用代码编织梦想,用GDB照亮前行的道路。期待在下一次的探索中,再次与你们相遇,共同书写更多关于编程与探索的辉煌篇章!
对于此次未能参与直播的朋友们,无需遗憾!我们的直播回放已准备就绪,等待着你们的点击与探索。错过直播的朋友可以到 格友视频号 观看录像,重温每一个精彩瞬间,感受GDB内存查看的每一个细节。
知识点归纳
1
x /4xw &var
以十六进制形式查看与变量var的内存地址开始的连续四个四字节(w)大小的内存单元的值
2
x/4dw &var-1
查看 var 变量地址前后四个字节(即一个int类型的大小)的内存内容
3
x/20d &intArray
以十进制格式显示20个内存单元的内容
4
x/20x &intArray
从这个地址开始显示20个十六进制数
5
x/s &charvar
指定了以字符串形式查看内存内容
06
x/2xw &person.name
2xw表示以无符号字(word,通常是4字节)的十六进制格式查看两个单位
7
p $pc
打印当前程序计数器的值
8
set {int} 0x7fffffeb98=12345
修改内存和寄存器的值
9
x/100ga 0x7fffffeb98
用于检查堆栈(stack)的内容(高级指令)
以下是一些示例截图,仅供参考
STEP
01
STEP
02
STEP
03
STEP
04
STEP
05
STEP
06
STEP
07
STEP
08
STEP
09
STEP
10
STEP
11
用于检查堆栈(stack)的内容(高级指令)
【盛格塾】
正心诚意,格物致知
以人文情怀审视软件,以软件技术改变人生
格友公众号
盛格塾小程序
扫描上方二维码或在微信中搜索“盛格塾”小程序
可以阅读更多文章和有声读物
往期推荐