解決GDB輸出Qt內置類型的顯示問題

自從GDB 7.0以後,就加入了Pretty-Printer的這個概念。簡單理解就是他可讓你用Python寫一串腳本,而後讓gdb去讀取這串腳本後,能夠自由的輸出由你想本身定義的格式。咱們直接舉個簡單例子:html

#include <QString>

int main(int argc, char *argv[])
{
    QString a = "abc";

    int i = 3;

    return 0;
}

在這裏咱們想打印a的值,咱們把斷點停到int i = 3上,而後p a能夠看到下面的輸出python

(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_printers
register_qt4_printers (None)
end
set print pretty 1

能夠看到裏面調用了register_qt4_printers這個函數並完成了相關注冊,將下好的qt4.py放到.gdb中以後從新gdb來查看a的值google

(gdb) p a
$1 = "abc"

哈哈,大功告成,此時的QString變量也能夠順利輸出了。spa

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才能夠。.net

 

參考連接:http://blog.csdn.net/dbzhang800/article/details/6830638code

                 http://nikosams.blogspot.com/2010/01/gdb-qt-pretty-printers-updated.htmlhtm

相關文章
相關標籤/搜索