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 '上一步的结果' 重点在那个单引号上面 否则就报不认识变量