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表示按十进制显示 |