СодержаниеИспользование помощников отладчикаБиблиотека помощника отладчика с C++При отладке Qt Creator динамически загружает вспомогательную библиотеку в вашу программу. Эта вспомогательная библиотека обеспечивает Qt Creator красивое отображение типов Qt и STL. Пакет Qt SDK уже содержит заранее скомпилированную библиотеку помощника отладчика. Чтобы создать собственную библиотеку помощника отладчика, выберите Инструменты > Параметры... > Qt4 > Профили Qt. Так как внутренние структуры данных Qt могут меняться для разных версий, библиотека помощника отладчика собирается для каждой версии Qt. Библиотека помощника отладчика с PythonС gdb с поддержкой Python вы можете использовать помощники отладчика и для определённых пользователем типов. Чтобы сделать это, определите одну функцию на Python для каждого определённого пользователем типа в .gdbinit. Имя функции должно быть вида qdump__NS__Foo где NS::Foo это класс или шаблон класса для просмотра. Можно использовать вложенные пространства имён. Подключаемый модуль отладчика вызывает эту функцию для отображения объекта этого типа. Этой функции передаются следующие параметры:
Функция должна наполнить объект Dumper определённой информацией, которая будет использована для построения вида Переменные этого объекта и его потомков. Пример: def qdump__QVector(d, item):
d_ptr = item.value["d"]
p_ptr = item.value["p"]
alloc = d_ptr["alloc"]
size = d_ptr["size"]
check(0 <= size and size <= alloc and alloc <= 1000 * 1000 * 1000)
check(d_ptr["ref"]["_q_value"] > 0)
innerType = item.value.type.template_argument(0)
d.putItemCount(size)
d.putNumChild(size)
if d.isExpanded(item):
p = gdb.Value(p_ptr["array"]).cast(innerType.pointer())
with Children(d, [size, 2000], innerType)
for i in d.childRange():
d.putItem(Item(p.dereference(), item.iname, i))
p += 1
Класс элементаКласс Python Item это небольшая обёртка вокруг значений, соответствующих одной строке вида Переменные. У класса Item есть следующие члены:
Класс DumperДля каждой строки в виде Переменные должна быть создана и соединена с подключаемым модулем отладки строка примерно следующего содержания. "{iname='некоторое внутреннее имя',
addr='адрес объекта в памяти',
name='содержимое столбца Имя',
value='содержимое столбца Значение',
type='содержимое столбца Тип',
numchild='число потомков', // достаточно указать ноль/не ноль
childtype='тип потомка по умолчанию', // не обязательно
childnumchild='число внуков по умолчанию', // не обязательно
children=[ // требуется только если элемент раскрывается в виде
{iname='внутреннее имя первого потомка',
... },
{iname='внутреннее имя второго потомка',
... },
...
]}"
Хотя, в принципе, вы можете собрать всю строку выше вручную, гораздо проще для этой цели использовать класс Python Dumper. Класс Python Dumper содержит полный каркас для обработки полей iname и addr, для обработки потомков простых типов, ссылок, указателей, перечислений, известных и неизвестных структур, а также некоторые вспомогательные методы для обработки общих ситуаций. У класса Dumper есть следующие члены:
Класс потомков и подэлементовПопытка создать дочерние элементы может привести к ошибкам если данные не инициализированы или повреждены. Для успешного восстановления в таких ситуациях используйте Children и SubItem для создания вложенных элементов. Конструктор Children __init__(self, dumper, numChild = 1, childType = None, childNumChild = None) использует один обязательный и три необязательных аргумента. Обязательный аргумент ссылается на текущий объект Dumper. Необязательные аргументы могут быть использованы для указания числа потомков numChild с типом childType_ числом потомков childNumChild_ у каждого. Если numChild_ это список из двух целых чисел, то первое будет указывать текущее число потомков, а второе - максимальное число потомков для вывода. Аналогично, использование класса Пример: d.putNumChild(2)
if d.isExpanded(item):
with Children(d):
with SubItem(d):
d.putName("key")
d.putItemHelper(Item(key, item.iname, "key"))
with SubItem(d):
d.putName("value")
d.putItemHelper(Item(value, item.iname, "value"))
X
|
|
Попытка перевода Qt документации. Если есть желание присоединиться, или если есть замечания или пожелания, то заходите на форум: Перевод Qt документации на русский язык... Люди внесшие вклад в перевод: Команда переводчиков |