如何使用GDB仅打印程序数据段中存储的变量?
如何用GDB仅打印数据段中的变量值
嘿,这个问题提得很到位!确实info variables会一股脑列出所有局部、全局变量,甚至一些符号表无关的内容,想要精准定位数据段变量的话,GDB本身就有几种实用的方法,我给你拆解一下:
方法1:通过地址范围过滤数据段变量
数据段通常分为.data(初始化的全局/静态变量)和.bss(未初始化的全局/静态变量),我们可以先拿到这两个段的地址范围,再用info variables限定查询范围:
获取数据段地址范围
执行info files命令,输出里会找到类似这样的段信息:0x0804a010 - 0x0804a014 is .data
0x0804a014 - 0x0804a038 is .bss
把这两个段的起始和结束地址记下来,合并成一个连续的范围(比如上面的0x0804a010到0x0804a038)。查询该范围内的变量
执行info variables <起始地址> <结束地址>,比如:info variables 0x0804a010 0x0804a038这样GDB就只会列出落在这个地址区间内的变量,也就是.data和.bss段里的全局/静态变量。之后你就可以用
print <变量名>单独查看每个变量的值了。
方法2:结合段信息过滤变量(带调试信息场景)
如果你的程序编译时加了-g调试参数,info variables的输出会标注每个变量所在的段。这时可以用GDB的内置过滤功能(或者配合shell管道,如果你在支持的终端里):
- 先关闭分页避免截断:
set pagination off - 直接过滤出.data和.bss段的变量:
这个命令会只保留标注了info variables | grep -E "\.(data|bss)".data或.bss的变量条目,之后同样用print查看具体值。
方法3:直接查看数据段内存内容(如果不知道变量名)
如果你不知道具体变量名,只想查看.data段的内存内容,可以用x命令(examine):
x /10wx &__data_start
其中:
/10wx表示以十六进制格式打印10个4字节的内容(你可以调整数字10来控制打印数量)&__data_start是.data段的起始地址符号(大部分系统都支持这个符号)
如果要看.bss段,就用&__bss_start替代。
注意点
- 常量字符串或const全局变量通常存在
.rodata段(只读数据段),如果需要包含这些,记得在地址范围或过滤规则里加上.rodata。 - 局部变量存在栈或寄存器中,不属于数据段,所以上面的方法不会显示它们,正好符合你的需求。
内容的提问来源于stack exchange,提问作者cloud916
相关产品推荐
相关产品推荐

