gdb 如何打印全局变量: print 包.变量

Golang GDB print global variable

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

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

1. 程序中使用全局变量为“包名.变量名”,所以在gdb中最开始也这么使用:

(gdb) p monitor.DefaultDevice
No symbol "monitor" in current context.

但是报错

2.于是查找golang官方文档: https://golang.org/doc/gdb 这里提到:

   All global variables are lumped into package "main".

   所以我理解“包名”应该改成“main”,于是在gdb中使用:

(gdb) p mian.DefaultDevice
No symbol "mian" 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 DefaultDevice
All variables matching regular expression "DefaultDevice":

File gitlab.sz.sensetime.com/viper/engine-video-process-service/vendor/gitlab.sz.sensetime.com/viper/gosdkwrapper/hal/monitor:
        string gitlab.sz.sensetime.com/viper/engine-video-process-service/vendor/gitlab.sz.sensetime.com/viper/gosdkwrapper/hal/monitor.DefaultDevice;

Non-debugging symbols:
0x00000000013ad0c0  gitlab.sz.sensetime.com/viper/engine-video-process-service/vendor/gitlab.sz.sensetime.com/viper/gosdkwrapper/hal/monitor.GetDefaultDeviceName.stkobj
(gdb)

 

哈哈,有结果,那说明gdb可以看到这个全局变量,只是之前还不知道怎么print出来(可以看出除了包名,还得带上路径名)。

那么按照结果继续:

(gdb) p gitlab.sz.sensetime.com/viper/engine-video-process-service/vendor/gitlab.sz.sensetime.com/viper/gosdkwrapper/hal/monitor.DefaultDevice
No symbol "gitlab" in current context.

还是失败,挫败。。。

4. 继续查找资料,这次用例百度。发现有篇文章中提到,p 变量名 的时候,变量名要加引号。 茅塞顿开,赶紧试试:

(gdb) p 'gitlab.sz.sensetime.com/viper/engine-video-process-service/vendor/gitlab.sz.sensetime.com/viper/gosdkwrapper/hal/monitor.DefaultDevice'
$3 = 0x11ce877 "cuda"

哈哈,果然可以了~!

5.总结 Go语言使用gdb打印global variable全局变量的方法:

p '完整包路径/包.变量名'

第一步: info variables 变量名

第二步:p '上一步的结果' 重点在那个单引号上面 否则就报不认识变量

上一篇:net core 微服务 快速开发框架 Viper 限流


下一篇:oracle表空间