PureBasic

Встроенные средства отладки

Эти инструменты предоставляют много возможностей для наблюдения за вашей программой во время её выполнения.Но их невозможно использовать, когда вы редактируете исходный код. Эти инструменты предоставляются и во встроенном Отладчике, и в самостоятельном отладчике. Консольный отладчик также предоставляет многие из этих возможностей, но через консоль отладки.

Некоторые из инструментов содержат просмотр переменных. Вот объяснение полей, общих для всех этих просмотров переменных:

Область видимости (Scope)
Область видимости переменной это область, в которой она корректна. Это может быть global (глобальная), local (локальная), shared (разделяемая), static (статическая) или threaded (потоковая), в зависимости от того, как она используется в вашем исходном коде. 'byref' ("ссылкой", т.е. использованием адреса) используется, чтобы указать Массив или Список, который был передан как параметр процедуре.

Тип переменной (Variable type)
Тип переменной обозначается цветной иконкой:
Byte (Байт)
Ascii (символ ascii)
Character (Символ)
Word (Слово)
Unicode (Юникод)
Long (Длинное целое)
Integer (Целое)
Quad (Четверное целое)
Float (С плавающей точкой)
Double (Двойное с плавающей точкой)
String (Строка)
Строка неизменной длины

Структура отмечается или точкой , или стрелкой. Если она отмечена стрелкой, её можно развернуть двойным кликом для просмотра членов структуры. Стрелка вниз отмечает развёрнутую структуру. Структуру, отмеченная точкой, развернуть невозможно (обычно потому что это лишь указатель на структуру).

Динамические массивы внутри структур показываются с теми измерениями, с которыми они в данный момент размещены в памяти. Связные списки и хеш-карты внутри структур показываются вместе с размером и текущим элементом (если есть).

Окно вывода Отладчика

В этом окне отображается вывод операторов Debug. Оператор Debug это быстрый и простой способ печатать сообщения с отладочными целями.

Окно отладки автоматически открывается при первом выводе, который произведёт ваша программа. Если вы после этого закроете его, оно уже не откроется автоматически при последующих сообщениях, которые тем не менее будут сохранены в журнале. Вы можете скопировать этот вывод в буфер обмена или сохранить его в файл. Есть также кнопка для очистки сообщений в окне.

Поле ввода внизу окна позволяет ввести выражение, которое будет вычислено, а результат напечатан в поле вывода. Это позволяет быстро проверить состояние переменных или полей массива без необходимости искать их в одном из инструментов отладки. Вычисление запускается нажатием клавиши Ввод или кликом кнопки "Показать" ("Display"). Если выражение вычислить по какой-то причине невозможно, в строке состояния отображается сообщение об ошибке.

Выражение может быть любым допустимым выражением PB (не включая логические единицы или ключевые слова PB). Выражение может содержать переменные, массивы, связные списки, константы и также некоторые команды библиотек Math, Memory и String.

Список наблюдения

Список наблюдения можно использовать для отслеживания изменений в переменных вашей программы в реальном времени, во время выполнения программы. Он может отображать только отдельные переменные (не структуры целиком), однако, эти переменные могут быть частями структур. Элементы динамического массива, связного списка или хеш-карты внутри структур невозможно показать в списке наблюдения.

Для добавления переменно выберите её процедуру (если это локальная переменная) или выберите "--- Main ---" если это глобальная переменная или часть массива или связного списка. Затем введите имя переменной как вы обращались бы к ней в исходном коде, и нажмите Добавить (Add).

  Examples:
  MyVariable$                 - добавить нормальную строковую переменную
  Array(1, 5)                 - добавить поле массива
  Structure\subfield[5]\value – добавить переменную в структуре
  MyList()\structuresubfield  – добавить переменную в структурированном списке
Вы можете также добавить новые наблюдаемые переменные из Просмотра Переменных, сделав правый клик на них и выбрав "добавить в список наблюдения"

В списке вы увидите значения наблюдаемых переменных. Если значение отображается как "---", это означает, что эта переменная в данной позиции в исходном коде некорректна. (например, если вы наблюдаете локальную переменную, или элемент связного списка, а список не имеет текущего элемента)

Наблюдаемые переменные запоминаются между сеансами отладки, и даже сохраняются вместе с опциями компилятора, так что вам не потребуется каждый раз заполнять этот список снова.

Просмотр Переменных

Просмотр переменных позволяет просматривать переменные программы, массивы, связные списки и хеш-карты. Отдельные закладки показывают глобальные и потоковые элементы в верхней части, а локальные, разделяемые и статические элементы в нижней части.

Для получения наиболее свежих данных из программы воспользуйтесь кнопкой "Обновить" ("Update"). Если программа приостановлена или находится режиме пошагового выполнения, содержимое автоматически обновляется на каждом шаге. Сделав правый клик на любой переменной или поле Массива/Связного списка, вы можете скопировать эту переменную, или добавить её в список наблюдения для отслеживания её значения в реальном времени.

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

Закладка 'Переменные' ('Variables')
Эта закладка показывает переменные программы. С помощью правого клика на динамическом массиве, связном списке или хеш-карте в структуре можно просмотреть их содержимое в закладке "Просмотр Массива/Связного списка/Хеш-карты" ("View Array/List/Map").

Закладка 'Массивы' ('Arrays')
Эта закладка показывает список всех массивов в программе и измерений, с которыми они в данный момент определены. (-1 означает что оператор Dim ещё не был вызван) С помощью правого клика на массиве можно просмотреть его содержимое в закладке "Просмотр Массива/Связного списка/Хеш-карты" ("View Array/List/Map").

Закладка 'Связные Списки' ('Linked Lists')
Эта закладка показывает список всех Связных Списков, количество элементов, которое они в данный момент содержат ( "-" обозначает что оператор NewList ещё не был вызван), а также индекс текущего элемента списка. ( "-" обозначает что текущего элемента нет) С помощью правого клика на списке можно просмотреть его содержимое в закладке "Просмотр Массива/Связного списка/Хеш-карты" ("View Array/List/Map").

Закладка 'Хеш-карты' ('Maps')
Эта закладка показывает список всех Хеш-карт, количество элементов, которое они в данный момент содержат ( "-" обозначает что оператор NewMap ещё не был вызван), а также ключ текущего элемента хеш-карты. ( "-" обозначает что текущего элемента нет) С помощью правого клика на отображении можно просмотреть его содержимое в закладке "Просмотр Массива/Связного списка/Хеш-карты" ("View Array/List/Map").

Закладка 'Просмотр Массива/Связного списка/Хеш-карты' ('View Array/List/Map')
Воспользуйтесь этой закладкой для просмотра отдельных элементов массива, связного списка или хеш-карты. Также включая сюда массивы, связные списки ли хеш-карты внутри структур. Для этого введите имя массива, хеш-карты или связного списка, включая символы "()" на конце, выберите, какого вида элементы показывать и нажмите "Показать" ("Display"). Учите, что содержимое просмотра не обновляется автоматически, когда программа выполняется в пошаговом режиме.

"Показать все элементы" ("Display all items") просто показывает всё. "Показать только ненулевые элементы" ("Display Non-zero items only") отображает только те элементы, которые не содержат значение 0 или пустую строку. Это упрощает просмотр больших массивов/связных списков с немногими корректными элементами. Структур считается "нулём" если все её элементы содержат или значение 0 или пустую строку.

"Показать Диапазон" ("Display Range") позволяет выбрать для показа конкретный диапазон по индексу. Диапазон можно указать для каждого измерения Массива отдельно, разделяя их запятыми. Если одно измерение вообще не указано, показываются все его элементы. Вот несколько примеров корректного задания диапазона:
  "1-2, 2-5, 2" : первый индекс между 1 и 2, второй индекс между 2 и 5 и третий индекс 2.
  "1, 2-5"      : первый индекс 1 и второй индекс между 2 и 5.
  "1, , 5"      : первый индекс 1, любой второй индекс и третий индекс 5.
При отображении связного списка опцию "Показать Диапазон" ("Display Range") можно использовать для отображения диапазона элементов связного списка по индексу.
  "0"     : первый элемент
  "1-3"   : от второго до четвёртого элемента
При отображении хеш-карты опцию "Показать Диапазон" ("Display Range") можно использовать для фильтрации отображаемых ключей. Она должна содержать строку с маской для ключей элементов хеш-карты (без кавычек). Символ "?" соответствует одному символу, символ "*" соответствует любому количеству символов. Вот несколько примеров корректного ввода маски:
  "hat" : соответствует только пункт с ключом "hat".
  "?at" : соответствуют  пункты с ключами "hat", "bat" и тд.
  "h*t" : соответствуют пункты с ключами начинающимися с "h", заканчивающимися на "t" и любым символом по середине.

Профилировщик

Инструмент Профилировщик может подсчитывать, как часто выполняется каждая строка в исходном коде. Собранные данные можно использовать для определения, какие части кода используются наиболее часто и где улучшения имеют наибольший смысл. Также это помогает идентифицировать проблемы, когда кусок кода выполняется слишком часто в результате ошибки.

Запись данных (Recording the data)
Запись данных можно контролировать кнопками Старт (Start), Стоп (Stop) и Сброс (Reset) (установить все счётчики в 0) в окне профилировщика. Чтобы обновить график во время выполнения программы, воспользуйтесь кнопкой Обновить (Update). Каждый раз когда программа приостанавливается, или в пошаговом режиме данные обновляются автоматически. По умолчанию профилировщик записывает данные со запуска программы. Это можно изменить в Настройках IDE.

Просмотр данных (Examining the data)
Записанные данные отображаются как график, вертикальная ось которого показывает Номер строки исходного кода, а горизонтальная ось показывает как часто строки выполнялись. Если выполняющаяся программа состоит из более чем одного исходного файла, список исходных файлов выводится под графиком. Чтобы отобразить график для файла или выберите его, или отметьте его чекбокс. Для удобства сравнения на графике можно показать несколько файлов. Правый клик на одном из имён файлов позволяет изменить цвет, используемый для отображения этого файла на графике.

Режимы мыши в графике (Mouse modes in the graph)
Правый клик внутри графика вызывает контекстное меню, которое позволяет увеличить или уменьшить масштаб или показать строку исходного кода, которая была кликнута в среде разработки или в просмотре кода в отладчике. Действие, совершаемое по левому клику, можно контролировать кнопками по левую сторону:

Левый клик и перетаскивание позволяют прокручивать отображение графика.
Левый клик и перетаскивание позволяют выбрать область, которая будет приближена.
Когда эта кнопка активирована, движение мыши по графику отображает перекрестие для удобства определения строки и количества обращений под мышью.
Увеличить масштаб (Zoom in)
Уменьшить масштаб (Zoom out)
Уменьшить масштаб так, чтобы все строки были видны (Zoom out so all lines can be viewed)

Просмотр стека вызовов

Просмотр стека вызовов показывает, какие вложенные вызовы процедур, ведут к текущей позиции в коде. Каждый элемент в списке означает одну процедуру, которая в данный момент открыта. Она показывает строку и файл, из которого она была вызвана, и аргументы, которые были использованы при вызове процедуры. Сделав клик на кнопке Переменные (Variables) у каждой процедуре, вы можете просмотреть переменные этого экземпляра процедуры.

Это позволяет легко отследить, из какой части кода была вызвана процедура. Просмотр стека вызовов автоматически обновляется только когда вы останавливаете программу или используете Шаг (Step) для выполнения отдельных строк. Во время выполнения программы для обновления текущей позиции кода в просмотре вам необходимо использовать кнопку Обновить (Update).

Закладка "Статистика" ("Statistics") показывает количество раз, когда вызывалась каждая процедура. Вы можете сбросить количество для всех процедур с помощью кнопки "Сбросить всё" ("Reset all") или для отмеченного в данный момент элемента с помощью кнопки "Сброс" ("Reset"). Как и со стеком вызовов, обновление не автоматическое пока программа не остановлена. Используйте для этого кнопку Обновить (Update).

Просмотр Памяти

Просмотр памяти позволяет вам просматривать область памяти в вашей программе. Диапазон для просмотра можно ввести в поля диапазона как любое корректное выражение PB. (Это может быть обычное десятичное значение, шестнадцатеричное число с символом '$' впереди или любое другое корректное выражение, включая переменные или указатели из кода). Если содержимое второго поля диапазона начинается со знака "+", содержимое понимается относительно первого поля.

Пример: от "*Buffer + 10" до "+30" отобразит 30 байтов памяти начиная с позиции 10-го байта после той, на которую указывает *Buffer.

Если область памяти доступна для просмотра, она отображается в области внизу. Если части области не доступны для чтения, вы получите сообщение об ошибке. Тип отображения можно изменять с помощью комбо-бокса в левом нижнем углу. Предусмотрены следующие режимы просмотра:

Шестнадцатеричный (Hex View)
Память отображается как в любом шестнадцатеричном просмотре, позиция в памяти выводится в шестнадцатеричном виде слева, за ней следуют шестнадцатеричные значения байтов, а затем строковое представление в правой колонке.

Таблица Byte/Character/Word/Long/Quad/Float/Double
Область памяти будет показана как таблица значений указанного типа. Будет ли в этой таблице одна колонка или несколько колонок, можно задать в Настройках IDE.

Строковый (String view)
Отображает область памяти как строку, в которой все нестроковые символы отображаются в [] (например "[NULL]" в случае байта 0.) Для повышения удобочитаемости после символов конца строки и [NULL] добавляется разрыв строк. Область памяти может интерпретироваться как строка Ascii, юникода или Utf8.

Также вы можете экспортировать просматриваемую память из просмотра памяти:

Копировать (Текст) (Copy (Text)): Копирует отображаемую область в буфер обмена как текст.
Сохранить (Текст) (Save (Text)): Сохраняет отображаемую область в файл как текст.
Сохранить (Как есть) (Save (Raw)): Сохраняет область памяти в файл как необработанные двоичные данные.

Просмотр Библиотек

Просмотр Библиотек предоставляет информацию об объектах, которые были созданы определёнными библиотеками. Он позволяет быстро выяснить, какие образы загружены в данный момент в программе, или какие Гаджеты созданы.

Сразу после запуска программы можно воспользоваться комбо-боксом вверху окна, чтобы выбрать библиотеку для просмотра. Список ниже покажет все объекты библиотеки, который в данный момент существуют в исполняемом файле, вместе с кое-какой дополнительной информацией по каждому объекту. Кнопка "Обновить" ("Update") обновляем этот список объектов. Выбор объекта из списка отобразит более подробную информацию о нём в текстовой области слева, а также, если это поддерживается библиотекой, визуальное отображение объекта справа. (для Изображений, Спрайтов, ...)

Если комбо-бокс показывает "Нет Информации" ("No Information"), это означает, что ваш исполняемый файл не использует ни одной библиотеки, поддерживающей эту возможность.

На данный момент Просмотр Библиотек поддерживается следующими библиотеками:
Thread
Gadget
Window
File
Image
Sprite
XML

Отладчик Ассемблера

Ассемблерный отладчик предоставлен опытным программистам, чтобы они просматривали и изменяли содержимое регистров процессора и просматривали стек программы для отладки кода Встроенного Ассемблера.

Просмотр Регистров Процессора доступен только когда выполнение программы приостановлено. Поменяв любое из значений регистров и кликнув "Задать" ("Set"), вы можете изменить значение в том регистре.

Трассировка Стека показывает содержимое стека программы, данное относительно регистра ESP. Если текущая позиция стека не выравнена по кратному 4 байтам адресу, никакой информации о содержимом стека не даётся. В этом случае стек показывается в шестнадцатеричном режиме просмотра.

Если указатель стека выравнен как следует, содержимое стека отображается с комментариями о значении содержащихся значений. (подробно поясняя помещённые в стек регистры и другие значения при вызове процедуры PB.)

Трассировка стека автоматически обновляется когда вы останавливаете выполнение, или выполняете программу в пошаговом режиме, если только вы не указали что-то иное в Настройках IDE. Если вы отключили автоматическое обновление, отображается кнопка "Обновить" ("Update"), чтобы сделать это вручную.

Примечание: Ассемблерный отладчик в данный момент отсутствует в MacOSX.

Пурифаер

Пурифаер (Purifier) может обнаруживать ошибки памяти, такие как запись после конца выделенного в памяти буфера или строки. Без пурифаера некоторые из таких ошибок привели бы к сбоям, а другие прошли бы незамеченными, потому что операция записи переписывает какую-то другую корректную память.

Пурифаеру для работы требуется специальный вывод компилятора, вот почему он доступен только если при компиляции программы в параметрах компилятора, задана опция "Включить Пурифаер" ("Enable Purifier").

Пурифаер обнаруживает эти ошибки, размещая специальное значение ('salt'-value) вокруг глобальных и локальных переменных, строк и выделенных в памяти буферов. Эти специальные значения затем проверяются через равные промежутки, и если они изменились, отображается ошибка. Эти проверки заметно замедляют выполнение программы, особенно для больших программ, вот почему частоту, с которой выполняются проверки, можно указать в окне пурифаера:

Шаг глобальной переменной (Global variable space)
Определяет промежуток в строках исходника, после которого проверяются глобальные переменные.

Шаг локальной переменной (Local variable space)
Определяет промежуток в строках исходника, после которого проверяются локальные переменные.

Строковые переменные (String variables)
Определяет промежуток в строках исходника, после которого проверяется память, используемая строковыми переменными.

Выделенная память (Allocated memory)
Определяет промежуток в строках исходника, после которого проверяется память, выделенная с помощью функции AllocateMemory().