Использование помощников отладчикаQt Creator может отображать сложные структуры особым способом, который может быть изменён пользователем. Для этого он использует две технологии, которые называются Помощники отладчика. Использование помощников отладчика не обязательно для отладки с помощью Qt Creator, но они значительно помогают пользователю быстро просматривать сложные типы данных. Помощники отладчика на C++Это первый подход для отображения сложных типов данных. Хотя он был заменён на большинстве платформ более простым и гибким вторым подходом, использующем скрипты на Python, он является единственным возможным подходом для Windows/MSVC, Mac OS и старых дистрибутивов Linux. Более того, этот подход будет автоматически выбран в качестве запасного варианта если не сработает подход, основанный на скриптах Python. Во время отладки с помощниками отладчика на C++, Qt Creator динамически загружает вспомогательную библиотеку в виде DLL или разделяемого объекта в отлаживаемый процесс. Пакет Qt SDK уже содержит заранее скомпилированную библиотеку помощника отладчика. Чтобы создать собственную библиотеку помощника отладчика, выберите Инструменты > Параметры... > Qt4 > Профили Qt. Так как внутренние структуры данных Qt могут меняться для разных версий, библиотека помощника отладчика собирается для каждой версии Qt. Помощники отладчика на PythonНа платформах с поддерживающей Python версией отладчика gdb данные извлекаются с помощью скрипта на Python. Это более надёжно так как выполнение скрипта отделено от процесса отладки. Этот способ также проще расширять, так как скрипт слабо зависит от текущей версии Qt и не требует компиляцию. Для расширения поставляемых помощников отладчика на Python с целью поддерживания пользовательских типов, определите по одной функции на Python для каждого типа пользователя в загрузочном файле gdb. По умолчанию используется следующий загрузочный файл: ~/.gdbinit. Для использования другого файла, выберите Инструменты > Параметры... > Отладчик > Gdb и укажите имя файла в поле Сценарий запуска gdb. Имя функции должно быть вида 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_ это список из двух целых чисел, то первое будет указывать текущее число потомков, а второе - максимальное число потомков для вывода. Аналогично, использование класса SubItem помогает защитить отдельные элементы. Пример: 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")) [Предыдущий: Настройка отладчика] [Следующий: Использование эмулятора Maemo] X
|
Попытка перевода Qt документации. Если есть желание присоединиться, или если есть замечания или пожелания, то заходите на форум: Перевод Qt документации на русский язык... Люди внесшие вклад в перевод: Команда переводчиков |