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

From SunFlurry wiki
Jump to: navigation, search

Встроенный отладчик является инструментом разработчика, доступным из визуального и консольного клиентов (консольный клиент не должен быть запущен в режиме сервиса) для нахождения и устранения ошибок в программном коде и также для измерения производительности кода (см. Встроенный профайлер). Для использования отладчика необходимо иметь права отладки, которые включаются программно с помощью функции DebuggingRights, либо в файле инициализации клиента с помощью переменной DebuggingRights. Кроме того, для отладки существующих модулей, необходимо наличие административных прав (см. Общая информация о сервере базы данных), так как без них, сервер не позволит загружать исходные тексты проекта, что сделает отладку невозможной. Без наличия административных прав, однако, можно задать путь к исходным файлам проекта в переменной AdditionalSourcePaths файла инициализации клиента или из окна отладчика. Кроме того, исходные тексты, исполняемые в функциях, типа Exec или ExecEx будут доступны без дополнительных прав, так как не будет необходимости скачивать исходный текст с сервера. На рисунке 1 показан примерный вид окна отладчика, которое будет открыто (при наличии прав отладки) в следующих случаях:

  • Пользователь нажал клавиши Ctrl+Alt+C. При этом будет показан список выполняющихся в данный момент потоков, и пользователь сможет выбрать поток для остановки. Поток будет остановлен в момент, когда он начнет выполнять какой-либо код, либо сразу же, если код выполняется им в данный момент.
  • При исполнении кода произошло исключение и для сеанса активен режим BreakOnExceptions (режим можно активировать в файле инициализации клиента или в меню окна отладчика (см. ниже). При этом отладчик покажет текущий модуль и строку в которой произошло исключение. Строка будет выделена желтым цветом (цвет исключения) и в нее будет перемещен курсор.
  • При запуске клиента в момент исполнения первой строчки кода (часто глобальный модуль Module.sf), если в файле инициализации клиента активирован режим StartInDebugger. При этом отладчик покажет текущий модуль и строку начала исполнения кода. Строка будет выделена красным цветом (цвет остановки по требованию) и в нее будет перемещен курсор.
  • В момент, когда система встречает в программном модуле команду Debugbreak. При этом отладчик покажет текущий модуль и строку, которая вызвала остановку. Строка будет выделена красным цветом (цвет остановки по требованию) и в нее будет перемещен курсор.
  • Если в программном тексте из отладчика установлены контрольные точки (см. ниже), в т.ч. точки по условию или прерывание после выхода из текущего уровня и пр., отладчик будет открыт (если разработчик успел его закрыть) и покажет текущий модуль и строку, которая вызвала остановку. Строка будет выделена красным цветом (цвет остановки по требованию) и в нее будет перемещен курсор.

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

  1. Главное меню окна отладчика. Меню содержит следующие пункты:
    • Меню Файл содержит общие пункты меню:
      • Местоположение исходных текстов -- позволяет задать локальную папку проекта, для получения исходных текстов из этой папки. Обычно исходные тексты загружаются непосредственно с сервера, но если отладка происходит под учетной записью, не имеющей прав администратора, сервер не разрешит загрузку исходных текстов, и, в этом случае, можно дать указание на локальную папку, откуда эти тексты будут загружены в процессе отладки. Эта функция соответствует переменной AdditionalSourcePaths в файле инициализации клиента.
      • Выбрать рабочий поток... -- позволяет вывести диалог списка потоков, выполняющихся в данный момент (пункт 6 на рис. 1). При нажатии на кнопку "Остановить", для выделенного потока будет добавлена точка остановки, которая сработает в момент, когда поток начнет выполнять любой код. В режиме ожидания поток остановить нельзя, так как в этом режиме поток не выполняет никакой код и ожидает наступления внешнего события или ввода данных пользователем. Кнопка Выбрать делает указанный поток текущим в отладчике (все вычисляемые выражения будут производиться в этом потоке). При остановке на по требованию, однако, текущий поток автоматически меняется на тот, в котором сработала точка остановки. В диалоге показано имя потока (создающееся из заголовка формы потока или пути к его модулю, если поток не имеет формы и текущий загруженный модуль потока.
      • Остановить все потоки и перезапустить систему (функция доступна только для консольных клиентов) -- вызывает перезапуск консольного клиента.
      • Остановить все потоки и завершить работу (функция доступна только для консольных клиентов) -- вызывает завершение работы консольного клиента.
      • Выйти из отладчика (Ctrl+X) -- закрывает отладчик и продолжает выполнение, если оно было прервано для отладки.
    • Меню Действия содержит основные возможности точек остановки для отладки исходных текстов:
      • Искать (Ctrl+F) -- выводит диалог поиска в исходном тексте, открытом в данный момент (см. Редактор модулей).
      • Искать далее (Ctrl+L) -- продолжает поиск, инициированный ранее.
      • Переход к строке (Ctrl+G) -- вызов диалога ввода номера строки, чтобы перейти к строке с указанным номером внутри активного исходного текста.
      • Переход к функции (Ctrl+H) -- вызов диалога со списком функций текущего модуля для перехода к началу требуемой функции.
      • Добавить вычисляемое выражение (Ctrl+F5) -- вызывает диалог вычисляемого выражения, который позволяет вычислить произвольное выражение в текущем потоке (см. ниже).
      • Исполнить произвольное выражение -- вызывает диалог исполнения произвольного выражения, которое может изменить переменные в текущем потоке, либо выполнить произвольные действия. Для работы диалога текущий поток отладчика должен находиться в режиме остановки по требованию.
      • Точка останова (F2) -- добавляет или удаляет безусловную точку остановки по требованию в строке, в которой находится курсор. Точка остановки работает только для текущего потока, программа будет остановлена в момент когда исполняемый код достигнет строки с точкой остановки. Точки остановки отображаются красными кружками на левой панели окна исходной текста (пункт 4 рис. 1).
      • Точка останова с условием (Ctrl+F2) -- добавляет или удаляет точку остановки по требованию с дополнительным условием в строке, в которой находится курсор. Точка остановки работает только для текущего потока, программа будет остановлена в момент когда исполняемый код достигнет строки с точкой остановки и выполнение условия вернет положительный ответ (целое число с младшим битом равным единице). Такие точки остановки работают медленнее и будут замедлять выполнение программы, если они находится внутри критического цикла с большим количеством обращений. Если условие задано неверно, оно не будет работать. Для просмотра или изменения условия, необходимо снова выбрать этот пункт меню (или Ctrl+F2) в строке с точкой остановки. Точки остановки отображаются красными кружками со знаком вопроса внутри на левой панели окна исходной текста (пункт 4 рис. 1).
      • Отключить точку останова (Alt+F2) -- отключает или включает точку остановки. В отключенном состоянии точка не будет вызывать остановку. Для ее включения, выберите пункт повторно. Отключенные точки остановки отображаются серыми кружками на левой панели окна исходной текста (пункт 4 рис. 1).
      • Удалить все точки останова -- пункт позволяет удалить все точки остановки, даже те, которые не относятся к текущему потоку.
      • Список точек останова -- выводит диалог с полным списком текущих точек остановки (в том числе отключенных) и модулей, в которых эти точки установлены. С помощью двойного клика мыши, можно перейти к исходному тексту в строку выделенной точкой остановки.
    • Меню Отладка содержит дополнительные возможности отладки исходных текстов:
      • Продолжить (F9) -- используется для продолжения исполнения, если оно было прервано точкой остановки, прерыванием или остановкой по требованию. Окно отладчика при этом закрыто не будет.
      • Остановить (Ctrl+C) -- используется для инициации остановки по требованию в текущем выбранном потоке. Если поток исполняет код в данный момент, он будет остановлен сразу и курсор будет перемещен на строку, в которой сейчас происходит исполнение. Если поток находится в режиме ожиданий пользователя, он будет остановлен, как только произойдет любое событие, внутри обработчика этого события.
      • Шагнуть через (F8) -- используется для инициации остановки по требованию в следующей встреченной строке кода, после строки, на которой в данный момент остановлено исполнение. Если в текущей строке находится вызов функций, остановка не будет инициирована на их коде. Т.е., остановка пропускает любой код который будет инициировать увеличение стека по сравнению с текущим и останавливается на следующей строке кода на текущем уровне вложенности или при выходе из текущей функции. После установки точки остановки по требованию, исполнение в текущем потоке будет продолжено.
      • Шагнуть в (F7) -- используется для инициации остановки по требованию в следующей встреченной строке кода, после строки, на которой в данный момент остановлено исполнение. Вне зависимости от уровня вложенности, исполнение будет остановлено при любом изменении строки исполнения. После установки точки остановки по требованию, исполнение в текущем потоке будет продолжено.
      • Шагнуть из (Shift+F7) -- используется для инициации остановки по требованию в следующей встреченной строке кода, после выхода из функции, на которой в данный момент остановлено исполнение. После установки точки остановки по требованию, исполнение в текущем потоке будет продолжено.
      • Идти до курсора (F4) -- используется для инициации остановки по требованию в строке, в которой в данный момент находится курсор. После установки точки остановки по требованию, исполнение в текущем потоке будет продолжено.
      • Перейти на текущую строку (INS) -- используется мгновенной установки курсора на строку, на которой произошла остановка текущего потока (курсор исполнения).
      • Идти до следующего открытия модуля -- используется для инициации остановки по требованию в первой же строке кода любого нового модуля, загруженного в текущем или новом потоке. После установки точки остановки по требованию, исполнение в текущем потоке будет продолжено.
      • Останавливаться на исключениях -- пункт помогает изменить состояние глобальной установки клиента, когда любое исключение будет вызывать открытие отладчика. Состояние этой установки по умолчанию задается BreakOnExceptions в основном файле инициализации клиента.
    • Меню Профайлер содержит возможности профилирования исходных текстов. Меню доступно, только если текущий поток в данный момент остановлен. Для описания пунктов меню и возможностей профилирования, см. статью Встроенный профайлер.
    • Меню Окна содержит стандартные возможности по работе с открытыми в отладчике окнами исходных текстов.
      • Закрыть (Ctrl+F4) -- закрывает окно текущего модуля.
      • Закрыть все, кроме текущего -- помогает избавиться от большого количества окон с исходными текста, оставляя текущее рабочее окно открытым.
  2. Закладки окон исходных текстов. Закладки открываются автоматически отладчиком, если срабатывает остановка в коде из-за исключения, функции Debugbreak, остановка по требованию, контрольная точка и т.д. В заголовке закладок дается полное имя модуля закладки. Для закрытия лишний окон можно использовать комбинацию Ctrl+F4 или меню правой клавиши мыши при клике на заголовке закладки.
  3. Панель вычисляемых выражений содержит выражения, добавленные с помощью диалога вычисляемого выражения (Ctrl+F5). Значение всех выражений будет обновлено в момент, когда поток будет остановлен (т.е., для функции "шага" по исходному тексту (F8) -- после каждого шага). Большое количество выражений может замедлить отладку. Если в выражении найдена ошибка, ее описание будет выведено вместо результата вычисления выражения. Правое меню мыши панели позволяет осуществлять следующие действия с выражениями:
    • Добавить выражение -- выводит диалог вычисляемого выражения, в котором можно задать новое выражение и добавить его в панель.
    • Редактировать выражение -- выводит диалог вычисляемого выражения, заполненный текущим выражением под курсором, вместо добавления нового выражения, этот диалог будет менять текущее.
    • Удалить выражение (DEL) -- позволяет удалить выделенное выражение из панели.
    • Удалить все выражения -- позволяет удалить все выражения из панели.
  4. Левая панель исходного текста содержит метки закладок текста, точек остановки или информацию о результатах профилирования для каждой из строк. Для информации по профилированию, см. статью Встроенный профайлер.
  5. Окно исходных текстов содержит исходный текст в виде редактора исходных текстов, в котором запрещены изменения текста, см. статью Редактор модулей. Строка, в которой в данный момент произошла остановка исполнения выделяется красным цветом. Если в строке произошло также исключение, будет использовано выделение желтым цветом.
  6. Окно выбора рабочего потока выводится автоматически при открытии окна отладчика, либо с помощью главное меню. Окно показывает список выполняющихся в данный момент рабочих потоков, с возможностью инициировать остановку любого.
  7. Окно стека вызовов содержит список сложенных вызовов функций и модулей до момента текущей остановки. При двойном клике по элементу списка будет открыт соответствующий исходный текст и курсор перемещен к месту вызова.
  8. Панель исключений содержит все накопленные отладчиком исключения. Правое меню мыши позволяет перейти к исходному коду, вызвавшему исключение, очистить список исключений, или сохранить исключения в текстовый файл.
  9. Панель статуса отладчика служит для вывода различных статусов:
    • Статуса текущего (выбранного потока) -- работает, остановлен, в ожидании пользователя и т.д.
    • Положения курсора в окне исходного текста.
    • Наименование выбранного в данный момент потока (отладка именно этого потока выполняется в данный момент).

Диалог вычисляемого выражения

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

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