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 '上一步的結果' 重點在那個單引號上面 否則就報不認識變量