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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM