標籤:
自從GDB 7.0之後,就加入了Pretty-Printer的這個概念。簡單理解就是他可以讓你用Python寫一串指令碼,然後讓gdb去讀取這串指令碼後,可以自由的輸出由你想自己定義的格式。我們直接舉個簡單例子:
#include <QString>int main(int argc, char *argv[]){ QString a = "abc"; int i = 3; return 0;}
在這裡我們想列印a的值,我們把斷點停到int i = 3上,然後p a可以看到下面的輸出
(gdb) p a$1 = {static null = {<No data fields>}, static shared_null = {ref = { _q_value = 2}, alloc = 0, size = 0, data = 0xb7fb14d2 <QString::shared_null+18>, clean = 0, simpletext = 0, righttoleft = 0, asciiCache = 0, capacity = 0, reserved = 0, array = {0}}, static shared_empty = {ref = {_q_value = 1}, alloc = 0, size = 0, data = 0xb7fb14be <QString::shared_empty+18>, clean = 0, simpletext = 0, righttoleft = 0, asciiCache = 0, capacity = 0, reserved = 0, array = {0}}, d = 0x804b008, static codecForCStrings = 0x0}
這個顯然不是我們可以接受的,於是google了一番,發現還真有關於Qt的Printer,其實就是個py檔案,下下來之後我們需要在我們自己的.gdbinit上加入
python import sys sys.path.insert(0, ‘/home/rickyk/.gdb‘) from qt4 import register_qt4_printersregister_qt4_printers (None)endset print pretty 1
可以看到裡面調用了register_qt4_printers這個函數並完成了相關註冊,將下好的qt4.py放到.gdb中之後重新gdb來查看a的值
(gdb) p a$1 = "abc"
哈哈,大功告成,此時的QString變數也可以順利輸出了。
PS: 關於Qt Creator的Debug Helper和這篇文章的原理有點區別,Qt Creator採用的Debug技術只要是用了Python的dumper。因為相容性的問題,Qt Creator要保證在絕大多數機器上都可以使用,所以gdb版本必須滿足6.8.50才能支援支援Python指令碼從而進行Pretty Printer,如果這樣的話就不能保證所有的機器都可以正確看到Qt內建變數。所以Qt Creator用了gdb比較通用的特性----Compiled Dumpers,於是乎,Qt Creator自己寫了一個Dumper專門用來配合Debug,這樣解決了平台相容性問題。當然了,目前很多Qt Creator安裝包裡都會內建一個支援Python的gdb也是出於這方面的考慮,總之這兩套原理並不相同,也就是說,如果你想讓你的終端gdb正常輸出,你還是得去配一套Printer才可以。
參考連結:http://blog.csdn.net/dbzhang800/article/details/6830638
http://nikosams.blogspot.com/2010/01/gdb-qt-pretty-printers-updated.html
解決GDB輸出Qt內建類型的顯示問題