gdb с красивыми принтерами Qt

Моя цель - разрешить красивую печать классов Qt в gdb. Т.е. если у меня есть:

QString str("str"); 

в моем коде и выполнить

(gdb) print qwe 

Я хочу, чтобы содержимое str было напечатано (а не реальная структура QString).

Сам gdb поддерживает определение симпатичных принтеров с помощью python, и кажется, что Qt Creator частично использует эту функцию.

Идеальным решением было бы использовать симпатичные принтеры, поставляемые с Qt (можно найти в QT_INSTALLATION \ share \ qtcreator \ gdbmacros) или, возможно, даже весь отладчик (можно найти в QT_INSTALLATION \ pythongdb).

Во всяком случае, тролли создают новый api для определения симпатичных принтеров поверх стандартного gdb api, и я не могу понять, как включить его в простом отладчике gdb.

Итак, есть ли способ запустить gdb с включенными симпатичными принтерами Qt без Qt Creator, или, возможно, какая-либо информация о том, как это сделать.


person Eugene Loy    schedule 11.02.2011    source источник


Ответы (3)


На самом деле для qt есть симпатичные принтеры: http://nikosams.blogspot.com/2009/10/gdb-qt-pretty-printers.html.

person Niko Sams    schedule 02.06.2011

Я не думаю, что Qt Creator использует красивые принтеры в строгом смысле, они, вероятно, используют интерфейс GDB / MI для прямого доступа к переменным и их содержимому. Если вы хотите использовать Pretty Printers для отображения содержимого QString, вы можете просто проверить, где в типе находится настоящая строка, а затем показать ее. Вот пример для типа std::string C ++:

 class StdStringPrinter:
     "Print a std::string"

     def __init__ (self, val):
         self.val = val

     def to_string (self):
         return self.val['_M_dataplus']['_M_p']

     def display_hint (self):
         return 'string'

Обратите внимание на доступ к интервальным переменным класса на val['_M_dataplus']['_M_p'].

person Tarantula    schedule 15.02.2011

Qt Creator действительно использует скрипты python gdb для красивой печати, но он не использует механизм красивой печати gdb, основанный на python, который не обрабатывает более сложные случаи, такие как свойства QObject. Однако этот механизм производит вывод в стиле gdb / MI (немного похож на JSON), поэтому его нелегко прочитать в командной строке. Минималистичная документация по интерфейсу есть на http://doc.qt.nokia.com/qtcreator-snapshot/creator-debugging-helpers.html.

person andre    schedule 24.05.2011