PureBasic

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

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

Чтобы включить отладчик для вашей программы, вы можете выбрать пункт "Использовать Отладчик" ("Use Debugger") из меню отладчика, или задать это в настройках компилятора вашей программы. Посредством использования команды "Запуск с Отладчиком" ("Compile with Debugger") из меню компилятора, вы можете включить отладчик для одной компиляции.

Вы можете непосредственно использовать в ваших исходниках команды отладчика, такие как CallDebugger, Debug, DebugLevel, DisableDebugger и EnableDebugger.

Отладчик PureBasic поставляется в 3 видах:

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

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

Консольный отладчик. В основном этот отладчик используется для тестирования в неграфической среде, как в системах linux без X-сервера, или для для удалённой разработки через ssh.

Тип используемого отладчика можно выбрать в Настройках IDE.

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

Отладчик, интегрированный в среду разработки (IDE)

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

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

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

Подсказка:
Меню отладчика также добавляется к системному меню главного окна IDE (меню, которое вы увидите если кликните иконку PB слева/сверху окна). Это обеспечивает вам доступ к меню отладчика ещё и из Панели задач, по правому клику на иконке IDE в Панели задач.

Контроль программы

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

Состояние программы можно увидеть в строке состояния IDE, и в журнале в разделе ошибок.

Команды меню для контроля программы:

Остановить (Stop)
Приостанавливает программу и отображает текущую строку.

Продолжить (Continue)
Продолжает выполнение программы пока не будет соблюдено другое условие остановки.

Завершить программу (Kill Program)
Принудительно завершает программу и закрывает все связанные с ней окна отладчика.

Шаг (Step)
Выполняет одну строку исходного кода и затем снова останавливает выполнение.

Шаг (Step )
Выполняет количество шагов, которое вы можете указать, а затем снова останавливает выполнение.

Шаг в процедуре (Step Over)
Выполняет текущую строку в исходнике и затем снова останавливается, как обычный 'Шаг' ('Step'). Разница в том, что если текущая строка содержит вызовы процедур, выполнение не остановится внутри этих процедур, как это делает обычный 'Шаг' ('Step'), но будет выполнена вся процедура и остановка после возврата из неё. Это позволяет быстро проходить через процедуры в пошаговом режиме.

Выйти из процедуры (Step Out)
Выполняет оставшийся код внутри текущей процедуры и снова останавливается после возврата из процедуры. Если текущая строка не в какой-либо процедуре, будет сделан обычный 'Шаг' ('Step').

Точки останова на строках

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

Когда выполнение кода достигнет этой строки, оно остановится в этой точке. Учтите, что если вы выберите невыполняемую строку (такую как пустая строка или определение Структуры), точка приостановит выполнение на следующей выполняемой строке после этой.

После того, как выполнение вашей программы остановилось в точке останова, вы можете использовать любые команды меню Контроль программы (Program control) чтобы продолжить/закончить выполнение.

Точки останова можно задавать и удалять динамически, пока ваша программа выполняется, или когда вы редактируете ваш исходный код. С помощью команды "Очистить Точки останова" ("Clear Breakpoints") вы можете убрать все точки останова в исходном файле.

Примечание: Вы также можете задать/удалить Точки останова нажав клавишу Альт и кликнув по полоске, которая содержит метки Точек останова.

Условные Точки останова

Вдобавок к точкам остановки, задаваемым на строках, отладчик также предоставляет точки остановки на данных. Точки остановки на данных приостанавливают программу если выполнилось данное условие. Таким способом легко обнаружить, что переменная или другое значение в программе меняется и приостановить программу если это случится. Условием может быть любое выражение PureBasic, которое вычисляется до значения true или false. Это может быть что угодно, что можно поместить после ключевого слова If, включая логические операторы такие как And, Or или Not. Также доступны большинство функций библиотек Math, Memory и String, а также всех объектных функций проверки в форме IsXXX() и функций XxxID для получения идентификаторов OS для объекта.

Примеры условий:

MyVariable$ <> "Hello" Or Counter < 0  ; Остановка, если MyVariable$ не будет равен "Hello" или если Counter будет ниже нуля
PeekL(*SomeAddress+500) <> 0          ; Остановка, если long значение в данной ячейке памяти не равно нулю

Точки остановки на условиях можно добавлять с помощью опции Условная Точка останова (Data Breakpoint) в меню Отладчик. Они могут быть привязаны к конкретной процедуре или добавлены для всего кода. Особый пункт "Главный" ("Main") выбора процедур указывает, что точка остановки на условиях должна проверяться только когда выполнение не в какой-либо процедуре.

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

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

Просмотр переменных во время выполнения программы

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

Более сложные выражения (например, поля массива) можно просмотреть выделив их мышью и поместив курсор мыши над выделением.

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

Ошибки в программе

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

После этого вы всё ещё можете просматривать переменные вашей программы, стек вызовов или память, однако другие возможности, как отображение Реестра или трассировка стека после ошибки не доступны.

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

После ошибки (даже после фатальных), вам необходимо использовать команду "Завершить программу" ("Kill Program") для окончания работы программы и продолжить редактировать исходный код. Причина, почему программа не заканчивается автоматически в том, что это бы не позволило использовать другие возможности отладчика (такие как просмотр переменных) чтобы найти причину ошибки.

Примечание: вы можете настроить отладчик автоматически убивать программу при любой ошибке. Об этом смотрите раздел Настройка IDE .

Предупреждения отладчика

В некоторых случаях отладчик не может быть уверен, является ли данный параметр ошибкой или был указан таким образом сознательно. В таком случае отладчик выдаёт предупреждение. По умолчанию отображается предупреждение с указанием файла и Номера строки в журнале ошибок и отмечается строка (оранжевым в цветах по умолчанию). Таким образом предупреждения не остаются незамеченными, но не прерывают ход выполнения программы. Предусмотрен также выбор или игнорировать все предупреждения, или относиться ко всем предупреждениям как к ошибкам (останавливать программу). Можно глобально настроить обработку предупреждений отладчика в Настройках IDE или для текущей скомпилированной программы в Параметрах компилятора.

Журнал ошибок

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

Подменю "Журнал ошибок" ("Error log") меню Отладчик (Debugger) предоставляет функции для этого:

Показывать журнал ошибок (Show error log)
Показывает / скрывает журнал ошибок для текущего исходника.

Очистить журнал (Clear log)
Очищает журнал для этого файла.

Скопировать журнал (Copy log)
Копирует содержимое журнала ошибок в буфер обмена.

Очистить маркеры ошибок (Clear Error marks)
После того как вы убили программу, все отметки ошибок в исходном файле остаются. Это помогает вам идентифицировать строку, которая вызвала проблему, и решить её. Чтобы удалить эти отметки, воспользуйтесь командой "Очистить маркеры ошибок" ("Clear error Marks").

Также вы можете настроить среду разработки автоматически очищать отметки ошибок при окончании работы программы. Про это смотрите раздел Настройка IDE.

Автономный отладчик

Автономный отладчик очень похож на встроенный в IDE, и здесь объясняется лишь вкратце:

В окне Отладчика вы располагаете кнопками управления для осуществления контроля над программой, как это описано выше. Кнопка "Шаг" ("Step") выполняет столько шагов, сколько задано в поле редактирования рядом с ней. Закрытие Отладчика с помощью пункта меню "Выход" ("Quit") или кнопки закрытия также убьёт отлаживаемую программу.

Область Журнала ошибок можно скрыть кнопкой-стрелкой-вверх по правую сторону с целью сделать окно отладчика меньше.

Просмотр кода используется для отображения исполняемой в данный момент строки кода, а также ошибок или точек остановки. Используйте комбо-бокс над ним, чтобы выбрать включаемый файл для просмотра. Для управления точками останова в отображаемом в данный момент исходном файле воспользуйтесь кнопками "Задать Точку останова" ("Set Breakpoint"), "Удалить Точку останова" ("Remove Breakpoint") и "Очистить Точки останова" ("Clear Breakpoints"). Просмотр кода также предоставляет возможность из встроенного отладчика - навести мышь и быстро увидеть содержимое переменной.

К инструментам отладки можно обращаться посредством кнопок под областью кода. Их использование такое же, как в случае встроенного отладчика IDE.

Примечание: Автономный Отладчик не имеет своей собственной конфигурации. Он использует настройки отладчика или опции расцветки из среды разработки. Так что если вы используете Редактор от стороннего производителя и автономный отладчик, вам следует хотя бы один раз запустить среду разработки чтобы настроить Отладчик.

Запуск Автономного Отладчика из командной строки:
Чтобы запустить из командной строки программу, скомпилированную со включенной отладкой (ключ -d или /DEBUGGER), вызываете отладчик так:

pbdebugger <исполняемый файл> <командная строка исполняемого файла>

Если вы запустите исполняемый файл со включенной отладкой из командной строки непосредственно, он будет использовать только отладчик командной строки.

Удалённая отладка с Автономным отладчиком:

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

Отладчики во всех операционных системах и на всех типах процессоров, поддерживаемых PureBasic, совместимы, если версия PureBasic отладчика и компилятора, которым компилировалась программа, совпадает. Это означает, что программа, запущенная в Linux x64 может без проблем отлаживаться например с помощью машины x86 Windows. Отладчик и скомпилированный исполняемый файл могут оба играть роль и клиента, и сервера для сетевого подключения в зависимости от параметров командной строки. Один экземпляр отладчика может использоваться для отладки только одной программы. Множественные подключения невозможны.

Запуск отладчика в сетевом режиме:
Следующие параметры командной строки контролируют сетевые возможности самостоятельного отладчика.
  pbdebugger.exe /CONNECT=host[:port]  [/PASSWORD=password]
  pbdebugger.exe /LISTEN[=interface][:port]  [/PASSWORD=password]
Режим "connect" подключает отладчик в роли клиента к исполняемому файлу, который должен быть запущен перед этим в роли сервера. Режим "listen" создаёт сервер и ждёт входящего подключения от исполняемого файла. Если указан адрес IP локального сетевого интерфейса, сервер будет слушать только этот конкретный интерфейс. Иначе он будет слушать все сетевые интерфейсы для подключений на указанный порт. Если порт не указан, используется порт по умолчанию (порт 10101).

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

Запуск исполняемого файла в сетевом режиме:
Исполняемый файл должен компилироваться в режиме отладки как обычно (с использованием ключа компилятора /DEBUGGER или --debugger). Затем его можно запустить из командной строки со следующими параметрами для включения сетевого режима. Правила для режима клиента и сервера те же, что упомянуты выше.
  yourprogram.exe /DEBUGCONNECT=host[:port]  [/PASSWORD=password]
  yourprogram.exe /DEBUGLISTEN[=interface][:port]  [/PASSWORD=password]
Если параметры командной строки невозможно использовать для запуска программы в сетевом режиме (например потому, что программа также читает свои параметры командной строки и будет сбита с толку опциями, относящимися к отладчику), существует альтернативный путь посредством указания следующей переменной окружения перед запуском программы (чувствительно к регистру):
  PB_DEBUGGER_Communication=NetworkClient;host[:port][;password]
  PB_DEBUGGER_Communication=NetworkServer[;interface][:port][;password]
Как только сетевое соединение между отладчиком и исполняемым файлом установлено, сеанс отладки работает таким же образом, как локальная отладка. Если отладчик закрывается, отлаживаемый исполняемый файл также завершается. Отсоединить или переподключить отладчик после установления соединения невозможно.

Отладчик командной строки:

Отладчик командной строки не является частью IDE и как следствие не объясняется здесь подробно.

Чтобы открыть консольное приглашение отладчика во время работы программы, нажмите в консоли Ctrl+C. Чтобы получить обзор всех доступных команд, напечатайте в этом приглашении "help". Для более подробного описания команды напечатайте "help <имя-команды>".

Отладка программ с потоками:

Для использования отладчика с программой, которая создаёт потоки, в параметрах компилятора, должна быть задана опция 'Создавать потоко-безопасный исполняемый файл' ('Create threadsafe executable', так как иначе отображаемая отладчиком, касающаяся Номеров строк, ошибок, локальных переменных и тому подобного может быть неверна из-за нескольких потоков.

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

Во время выполнения программы просмотр переменных, просмотр стека вызовов или ассемблерный отладчик показывают информацию только по главному потоку. Когда программа останавливается, они показывают информацию по потоку, в котором они остановились. Так что для просмотра локальных переменных или стека вызовов потока выполнение должно быть прервано внутри этого потока (посредством размещения там точки остановки или оператора CallDebugger). Различные опции 'Шаг' ('Step') всегда применяются к потоку, в котором выполнение остановилось в последний раз.
Если происходит ошибка, выполнение прерывается внутри этого потока, так что любая информация, отображаемая просмотром переменных или просмотром стека вызовов относится к потоку, который вызвал ошибку.
Список наблюдений (watchlist) отслеживает только локальные переменные главного потока, не таковые любых добавочных выполняющихся потоков.

Пока выполнение одного потока остановлено, выполнение всех других потоков тоже приостанавливается.