Go语言gdb调试打印全局变量

总结自

Golang GDB print global variable

在使用GDB工具调试golang程序时,需要print一个全局变量,遇到各种报错,没办法打印出来,这里记录一下解决方法。

我的包名叫“sec”,全局变量名叫“G_sec”,代码中使用时为“sec.G_sec”


1. 程序中使用全局变量为“包名.变量名”,所以在gdb中最开始也这么使用:
(gdb) p sec.G_sec
No symbol "sec" in current context.
但是报错

2.于是查找golang官方文档: https://golang.org/doc/gdb 这里提到: All global variables are lumped into package "main". 所以我理解“包名”应该改成“main”,于是在gdb中使用: (gdb) p main.G_sec No symbol "main.G_sec" in current context. 还是同样报错。

3.继续查找资料(google+golang官方文档),发现一段说明: Show the name, type and location of global variables: (gdb) info variables regexp 于是try try look一下: (gdb) info variables G_sec All variables matching regular expression "G_sec": File go: int test/sec.G_sec; 哈哈,有结果,那说明gdb可以看到这个全局变量,只是之前还不知道怎么print出来(可以看出除了包名,还得带上路径名)。 那么按照结果继续: (gdb) p test/sec.G_sec No symbol "test" in current context. 还是失败,挫败。。。

4. 继续查找资料,这次用例百度。发现有篇文章中提到,p 变量名 的时候,变量名要加引号。 茅塞顿开,赶紧试试: (gdb) p 'test/sec.G_sec' $1 = 100 哈哈,果然可以了~!

5.总结 Go语言使用gdb打印global variable全局变量的方法: p 'test/sec.G_sec' 第一步: info variables 变量名 第二步:p '上一步的结果' 重点在那个单引号上面 否则就报不认识变量。

 

Golang Print Global Variable  kernel.idtptr [6]byte 

1,按照上述的步骤查看这个变量是否存在。

(gdb) info variables kernel.idtptr
All variables matching regular expression "kernel.idtptr":

2,按照内存查看方法,查看数组中的数据。

(gdb) x/6xb 'kernel.idtptr'
0x252b34 <kernel.idtptr>:	0xff	0x07	0x20	0x3d	0x25	0x00

 ps:内存查看指令

格式: x /nfu <addr>

说明
x 是 examine 的缩写

n表示要显示的内存单元的个数

f表示显示方式, 可取如下值
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
i 指令地址格式
c 按字符格式显示变量。
f 按浮点数格式显示变量。

u表示一个地址单元的长度
b表示单字节,
h表示双字节,
w表示四字节,
g表示八字节


Format letters are o(octal), x(hex), d(decimal), u(unsigned decimal),
t(binary), f(float), a(address), i(instruction), c(char) and s(string).
Size letters are b(byte), h(halfword), w(word), g(giant, 8 bytes)

举例
x/3uh buf
表示从内存地址buf读取内容,
h表示以双字节为一个单位,
3表示三个单位,
u表示按十进制显示

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值