Вам бонус- начислено 1 монета за дневную активность. Сейчас у вас 1 монета

Настройка отладчика.для среды Qt

Лекция



Привет, сегодня поговорим про настройка отладчика для среды 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 в Windows

Добавите Symbol Server, предоставляемый Microsoft, в путь поиска символов отладчика для получения отладочной информацией для библиотек операционной системы при отладке приложений Windows.

  1. Выберите Инструменты > Параметры... > Отладчик > Cdb.
  2. В поле Пути к символам откройте меню Вставить... и выберите Сервер символов....
  3. Выберите каталог где вы хотите хранить кэшируемую информацию и нажмите OK.

Используйте подкаталог во временной директории, например, C:\temp\symbolcache.

Замечание: Заполнение кэша может потребовать много времени на медленных соединениях.

Замечание: При первой отладке с Debugging tools for Windows, Qt Creator попросит у вас добавить Symbol Server.

Использование помощников отладчика

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 это класс или шаблон класса для просмотра. Можно использовать вложенные пространства имен.

Подключаемый модуль отладчика вызывает эту функцию для отображения объекта этого типа. Этой функции передаются следующие параметры:

  • d типа Dumper
  • item типа Item

Функция должна наполнить объект 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 есть следующие члены:

  • __init__(self, value, parentiname, iname, name = None) - Конструктор. Внутреннее имя объекта создается объединением parentiname и iname. Если None передается в качестве аргумента для name, то используется серийный номер.
  • value - объект типа gdb.Value, представляющий отображаемое значение.
  • iname - внутреннее имя объекта, состоящее из разделенного точками списка идентификаторов, соответствующих положению представлению объекта в виде.
  • name - Дополнительное имя. Если оно задано, то будет использовано в столбце Имя вида. Если не задано, то вместо него будет использовано простое число в скобках.

Класс Dumper

Для каждой строки в виде Переменные должна быть создана и соединена с подключаемым модулем отладки строка примерно следующего содержания.

 "{iname='некоторое внутреннее имя',

   addr='адрес объекта в памяти',

   name='содержимое столбца Имя',

   value='содержимое столбца Значение',

   type='содержимое столбца Тип',

   numchild='число потомков',        // достаточно указать ноль/не ноль

   childtype='тип потомка по умолчанию', // не обязательно

   childnumchild='число внуков по умолчанию', // не обязательно

   children=[              // требуется только если элемент раскрывается в виде

      {iname='внутреннее имя первого потомка',

       ... },

      {iname='внутреннее имя второго потомка',

       ... },

      ...

   ]}"

Хотя, в принципе, вы можете собрать всю строку выше вручную, гораздо проще для этой цели использовать класс Python Dumper. Класс Python Dumper содержит полный каркас для обработки полей iname и addr, для обработки потомков простых типов, ссылок, указателей, перечислений, известных и неизвестных структур, а также некоторые вспомогательные методы для обработки общих ситуаций.

У класса Dumper есть следующие члены:

  • __init__(self) - Инициализирует выход пустой строкой и очищает стек потомков.
  • put(self, value) - низкоуровневый метод для прямого добавления в выходную строку.
  • putCommaIfNeeded(self) - добавляет запятую если текущий выход заканчивается '}', '"' или ']' .
  • putField(self, name, value) - добавляет при необходимости запятую и поле name='value'.
  • beginItem(self, name) - Начинает поле с записи name='.
  • endItem(self) - Заканчивает запись поля с помощью '.
  • endChildren(self) - Заканчивает запись списка потомков.
  • childRange(self) - Возвращает ряд потомков, указанных в текущем пространстве Children.
  • putItemCount(self, count) - Добавляет в выход поле value='<%d items'.
  • putEllipsis(self) - Добавляет поле '{name="<incomplete>",value="",type="",numchild="0"}'. Это автоматически делается endChildren если число потомков для вывода меньше чем текущее число потомков.
  • putName(self, name) - Добавляет поле name='...'.
  • putType(self, type) - Добавляет поле type='...' если type не совпадает с типом потомка родителя по умолчанию.
  • putNumChild(self, numchild) - Добавляет поле numchild='...' если numchild не совпадает со значением потомка родителя numchild по умолчанию.
  • putValue(self, value, encoding = None) - Добавляет поле value='...' с необязательным полем valueencoding='...'. Значение value должно быть преобразуемым в строку полностью состоящую из числовых и буквенных значений. Параметр encoding может быть использован для указания способа кодирования в случае если настоящее значение должно быть закодировано каким-либо образом для выполнения требования о содержании только числовых и буквенных значений. В настоящий момент поддерживаются следующие способы кодирования:
    • 0: незашифрованные 8-ми битные данные, интерпретируемые как Latin1.
    • 1: зашифрованные с помощью base64 8-ми битные данные, используемые для QByteArray, будут добавлены двойные кавычки.
    • 2: зашифрованные с помощью base64 16-ти битные данные, используемые для QString, будут добавлены двойные кавычки.
    • 3: зашифрованные с помощью base64 32-х битные данные, будут добавлены двойные кавычки.
    • 4: зашифрованные с помощью base64 16-ти битные данные, без кавычек (смотрите 2).
    • 5: зашифрованные с помощью base64 8-ми битные данные, без кавычек (смотрите 1).
    • 6: зашифрованные в виде %02x 8-ми битные данные (как с помощью QByteArray::toHex), будут добавлены двойные кавычки.
    • 7: зашифрованные в виде %04x 16-ти битные данные (как с помощью QByteArray::toHex), будут добавлены двойные кавычки.
  • putStringValue(self, value) - Кодирует QString и вызывает putValue с соответствующим способом кодирования encoding.
  • putByteArrayValue(self, value) - Кодирует QByteArray и вызывает putValue с соответствующим способом кодирования encoding.
  • isExpanded(self, item) - Проверяет раскрывается ли элемент с внутренним именем item.iname в виде.
  • isExpandedIName(self, iname) - Проверяет раскрывается ли элемент с внутренним именем iname в виде.
  • putIntItem(self, name, value) - Эквивалентно:

          self.beginHash()

     self.putName(name)

     self.putValue(value)

     self.putType("int")

     self.putNumChild(0)

     self.endHash()

  • putBoolItem(self, name, value) - Эквивалентно:

          self.beginHash()

     self.putName(name)

     self.putValue(value)

     self.putType("bool")

     self.putNumChild(0)

     self.endHash()

  • pushOutput(self) - Перемещает выходную строку в безопасное место, откуда она будет отправлена подключаемому модулю отладчика даже если дальнейшие операции вызовут исключение.
  • putCallItem(self, name, item, func) - Использует gdb для вызова функции func для значения, указанного в item.value, и выводит результат. Эта функция не доступна при отладке дампов ядра и не доступна для платформы Symbian из-за ограничений, накладываемых AppTRK.
  • putItemHelper(self, item) - "Главная функция", сразу обрабатывающая базовые типы, ссылки, указатели и перечисления, проход по всем потомкам и членам классов составных типов и вызов подходящих функций qdump__*.
  • putItem(self, item) - Эквивалентно:

     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 и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Кросс-платформенное программирование

создано: 2016-01-17
обновлено: 2021-03-13
132606



Рейтиг 9 of 10. count vote: 2
Вы довольны ?:


Поделиться:

Найди готовое или заработай

С нашими удобными сервисами без комиссии*

Как это работает? | Узнать цену?

Найти исполнителя
$0 / весь год.
  • У вас есть задание, но нет времени его делать
  • Вы хотите найти профессионала для выплнения задания
  • Возможно примерение функции гаранта на сделку
  • Приорететная поддержка
  • идеально подходит для студентов, у которых нет времени для решения заданий
Готовое решение
$0 / весь год.
  • Вы можите продать(исполнителем) или купить(заказчиком) готовое решение
  • Вам предоставят готовое решение
  • Будет предоставлено в минимальные сроки т.к. задание уже готовое
  • Вы получите базовую гарантию 8 дней
  • Вы можете заработать на материалах
  • подходит как для студентов так и для преподавателей
Я исполнитель
$0 / весь год.
  • Вы профессионал своего дела
  • У вас есть опыт и желание зарабатывать
  • Вы хотите помочь в решении задач или написании работ
  • Возможно примерение функции гаранта на сделку
  • подходит для опытных студентов так и для преподавателей



Комментарии


Оставить комментарий
Если у вас есть какое-либо предложение, идея, благодарность или комментарий, не стесняйтесь писать. Мы очень ценим отзывы и рады услышать ваше мнение.
To reply

Кросс-платформенное программирование

Термины: Кросс-платформенное программирование