Лекция
Привет, сегодня поговорим про настройка отладчика для среды qt, обещаю рассказать все что знаю. Для того чтобы лучше понимать что такое настройка отладчика для среды qt , настоятельно рекомендую прочитать все из категории Кросс-платформенное программирование.
Обычно взаимодействие между Qt Creator и отладчиком настраивается автоматически и от вас не потребуется никаких действий. Тем не менее у вас может быть установлена неподдерживаемая версия gdb, ваше окружение Linux может не содержать gdb вообще, или вы можете захотеть использовать Debugging Tools for Windows.
Замечание: Для использования Debugging Tools for Windows, вы должны установить их и добавить Symbol Server, предоставляемый Microsoft, в путь поиска символов отладчика. Для получения дополнительной информации смотрите Настройка Symbol Server в Windows.
Этот раздел описывает возможности по отладке кода C++ и предоставляет заметки о установке поддерживаемых отладчиков.
Подключаемый модуль отладчика поддерживает различные сборки отладчика gdb, с возможностью использовать скрипты на Python и без нее. Версии с поддержкой Python более предпочтительны, но они не доступны для Mac и старых версий Linux. На Windows, Symbian и Maemo поддерживается только версия с Python.
Версии без поддержки Python используют компилируемые версии помощников отладчика которые вы должны включать отдельно. Для получения дополнительной информации смотрите Помощники отладчика на C++.
Версия с поддержкой Python использует версию помощников отладчика, написанных на скриптах, поэтому вам не потребуется дополнительная настройка.
Отладчик CDB имеет аналогичную функциональность отладчику gdb без поддержки Python. Он использует код C++ для библиотеки помощников отладчика.
Следующая таблица описывает поддерживаемые отладчики для кода C++:
Платформа |
Компилятор |
Отладчик |
Python |
Режимы отладчика |
Linux |
gcc |
gdb |
Необязательно |
Терминал, Простой, Подключенный (только с Python), Удаленный |
Unix |
gcc |
gdb |
Да |
Терминал, Простой, Подключенный, Удаленный |
Mac OS |
gcc |
gdb |
Нет |
Терминал, Простой, Подключенный |
Windows/MinGW |
gcc |
gdb |
Нет |
Терминал, Простой, Подключенный, Удаленный |
Windows/MSVC |
Microsoft Visual C++ Compiler |
Debugging Tools for Windows/CDB |
Не применяется |
Терминал, Простой, Подключенный, Post-Mortem |
Symbian |
gcc |
gdb |
Да |
TRK |
Maemo |
gcc |
gdb |
Да |
Удаленный |
Есть несколько разных причин почему подключаемый модуль отладчика не сможет автоматически выбрать подходящий отладчик. Отладчик может отсутствовать (что чаще всего случается с CDB на Windows, который всегда требуется устанавливать пользователю вручную) или установленная версия может не поддерживаться. Для ознакомления с поддерживаемыми версиями и другой важной важной информацией об установке отладчиков смотрите таблицу ниже.
Отладчик |
Замечания |
Gdb |
На Linux установите версию 6.8, 7.0.1 (версия 7.0 не поддерживается), 7.1 или более позднюю. На Mac OS X установите Apple gdb версии 6.3.50-20050815 (сборка 1344) или позже. |
Debugging Tools for Windows |
Использование этого отладчика требует установку пакета Debugging Tools for Windows 32-bit или 64-bit (версии 6.11.1.404 для 32-bit или 64-bit версии Qt Creator соответственно), который доступен для свободного скачивания сMicrosoft Developer Network. Замечание: Visual Studio не включает требуемые Debugging Tools, и поэтому вы должны установить их отдельно. Собранная версия Qt SDK for Windows будет использовать эту библиотеку если она присутствует в системе. При ручной сборке Qt Creator с использованием компилятора Microsoft Visual C++, процесс сборки ищет требуемые файлы в "%ProgramFiles%\Debugging Tools for Windows". Настоятельно рекомендуется добавить Symbol Server, предоставляемый Microsoft, в путь поиска символов отладчика. Symbol Server обеспечивает вас отладочной информацией для библиотек операционной системы при отладке приложений Windows. Для получения дополнительной информации смотрите Настройка Symbol Server в Windows. |
Инструменты отладки для Mac OS X |
Бинарная поставка Qt содержит отладочный и релизный варианты библиотек. Об этом говорит сайт https://intellect.icu . Но если вы непосредственно укажите линковщику что вы хотите использовать отладочные библиотеки даже если ваше приложение скомпилировано как отладочное и релизное, библиотекой по умолчанию будет использована отладочная библиотека. Если в Qt Creator вы используете проекты основанные на qmake, вы можете установить флаг в вашей конфигурации запуска в режиме Проекты. В конфигурации запуска выберите Use debug version of frameworks. Для получения более подробной информации об отладке на Mac смотрите:http://developer.apple.com/mac/library/technotes/tn2004/tn2124.html Замечание: В Mac OS X Snow Leopard (10.6) есть ошибка, которую можно обойти способом, описанным здесь:http://bugreports.qt.nokia.com/browse/QTBUG-4962. |
Добавите Symbol Server, предоставляемый Microsoft, в путь поиска символов отладчика для получения отладочной информацией для библиотек операционной системы при отладке приложений Windows.
Используйте подкаталог во временной директории, например, C:\temp\symbolcache.
Замечание: Заполнение кэша может потребовать много времени на медленных соединениях.
Замечание: При первой отладке с Debugging tools for Windows, Qt Creator попросит у вас добавить Symbol Server.
Qt Creator может отображать сложные структуры особым способом, который может быть изменен пользователем. Для этого он использует две технологии, которые называются Помощники отладчика.
Использование помощников отладчика не обязательно для отладки с помощью Qt Creator, но они значительно помогают пользователю быстро просматривать сложные типы данных.
Это первый подход для отображения сложных типов данных. Хотя он был заменен на большинстве платформ более простым и гибким вторым подходом, использующем скрипты на Python, он является единственным возможным подходом для Windows/MSVC, Mac OS и старых дистрибутивов Linux. Более того, этот подход будет автоматически выбран в качестве запасного варианта если не сработает подход, основанный на скриптах Python.
Во время отладки с помощниками отладчика на C++, Qt Creator динамически загружает вспомогательную библиотеку в виде DLL или разделяемого объекта в отлаживаемый процесс. Пакет Qt SDK уже содержит заранее скомпилированную библиотеку помощника отладчика. Чтобы создать собственную библиотеку помощника отладчика, выберите Инструменты > Параметры... > Qt4 > Профили Qt. Так как внутренние структуры данных Qt могут меняться для разных версий, библиотека помощника отладчика собирается для каждой версии Qt.
На платформах с поддерживающей 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))
Класс Python Item это небольшая обертка вокруг значений, соответствующих одной строке вида Переменные. У класса Item есть следующие члены:
Для каждой строки в виде Переменные должна быть создана и соединена с подключаемым модулем отладки строка примерно следующего содержания.
"{iname='некоторое внутреннее имя',
addr='адрес объекта в памяти',
name='содержимое столбца Имя',
value='содержимое столбца Значение',
type='содержимое столбца Тип',
numchild='число потомков', // достаточно указать ноль/не ноль
childtype='тип потомка по умолчанию', // не обязательно
childnumchild='число внуков по умолчанию', // не обязательно
children=[ // требуется только если элемент раскрывается в виде
{iname='внутреннее имя первого потомка',
... },
{iname='внутреннее имя второго потомка',
... },
...
]}"
Хотя, в принципе, вы можете собрать всю строку выше вручную, гораздо проще для этой цели использовать класс Python Dumper. Класс Python Dumper содержит полный каркас для обработки полей iname и addr, для обработки потомков простых типов, ссылок, указателей, перечислений, известных и неизвестных структур, а также некоторые вспомогательные методы для обработки общих ситуаций.
У класса Dumper есть следующие члены:
self.beginHash()
self.putName(name)
self.putValue(value)
self.putType("int")
self.putNumChild(0)
self.endHash()
self.beginHash()
self.putName(name)
self.putValue(value)
self.putType("bool")
self.putNumChild(0)
self.endHash()
with SubItem(self):
self.putItemHelper(item)
Возникающие в последующих вызовах функций исключения ловятся, а весь вывод putItemHelper заменяется выводом:
...
except RuntimeError:
d.put('value="<invalid>",type="<unknown>",numchild="0",')
Попытка создать дочерние элементы может привести к ошибкам если данные не инициализированы или повреждены. Для успешного восстановления в таких ситуациях используйте 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"))
В общем, мой друг ты одолел чтение этой статьи об настройка отладчика для среды qt. Работы впереди у тебя будет много. Смело пиши комментарии, развивайся и счастье окажется в твоих руках. Надеюсь, что теперь ты понял что такое настройка отладчика для среды qt и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Кросс-платформенное программирование
Комментарии
Оставить комментарий
Кросс-платформенное программирование
Термины: Кросс-платформенное программирование