<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://sfsys.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%92%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BE%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA</id>
	<title>Встроенный отладчик - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://sfsys.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%92%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BE%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA"/>
	<link rel="alternate" type="text/html" href="http://sfsys.ru/index.php?title=%D0%92%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BE%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA&amp;action=history"/>
	<updated>2026-04-04T10:03:23Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.31.1</generator>
	<entry>
		<id>http://sfsys.ru/index.php?title=%D0%92%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BE%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA&amp;diff=3114&amp;oldid=prev</id>
		<title>Admin: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="http://sfsys.ru/index.php?title=%D0%92%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BE%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA&amp;diff=3114&amp;oldid=prev"/>
		<updated>2021-02-07T06:54:56Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Revision as of 06:54, 7 February 2021&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://sfsys.ru/index.php?title=%D0%92%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BE%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA&amp;diff=3113&amp;oldid=prev</id>
		<title>Admin at 06:24, 31 December 2020</title>
		<link rel="alternate" type="text/html" href="http://sfsys.ru/index.php?title=%D0%92%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BE%D1%82%D0%BB%D0%B0%D0%B4%D1%87%D0%B8%D0%BA&amp;diff=3113&amp;oldid=prev"/>
		<updated>2020-12-31T06:24:01Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{HeadLinks|&lt;br /&gt;
* [[Main_Page|Начальная страница]]&lt;br /&gt;
* [[Общая информация о консольном и визуальном клиентах]]}}&lt;br /&gt;
Встроенный отладчик является инструментом разработчика, доступным из визуального и консольного клиентов (консольный клиент не должен быть запущен в режиме сервиса) для нахождения и устранения ошибок в программном коде и также для измерения производительности кода (см. [[Встроенный профайлер]]). Для использования отладчика необходимо иметь права отладки, которые включаются программно с помощью функции [[DebuggingRights]], либо в файле [[Основной файл инициализации клиента|инициализации клиента]] с помощью переменной ''DebuggingRights''. Кроме того, для отладки существующих модулей, необходимо наличие административных прав (см. [[Общая информация о сервере базы данных]]), так как без них, сервер не позволит загружать исходные тексты проекта, что сделает отладку невозможной. Без наличия административных прав, однако, можно задать путь к исходным файлам проекта в переменной ''AdditionalSourcePaths'' [[Основной файл инициализации клиента|файла инициализации клиента]] или из окна отладчика. Кроме того, исходные тексты, исполняемые в функциях, типа [[Exec]] или [[ExecEx]] будут доступны без дополнительных прав, так как не будет необходимости скачивать исходный текст с сервера. На рисунке 1 показан примерный вид окна отладчика, которое будет открыто (при наличии прав отладки) в следующих случаях:&lt;br /&gt;
* Пользователь нажал клавиши &amp;lt;code&amp;gt;Ctrl+Alt+C&amp;lt;/code&amp;gt;. При этом будет показан список выполняющихся в данный момент потоков, и пользователь сможет выбрать поток для остановки. Поток будет остановлен в момент, когда он начнет выполнять какой-либо код, либо сразу же, если код выполняется им в данный момент.&lt;br /&gt;
* При исполнении кода произошло исключение и для сеанса активен режим ''BreakOnExceptions'' (режим можно активировать в [[Основной файл инициализации клиента|файле инициализации клиента]] или в меню окна отладчика (см. ниже). При этом отладчик покажет текущий модуль и строку в которой произошло исключение. Строка будет выделена желтым цветом (цвет исключения) и в нее будет перемещен курсор.&lt;br /&gt;
* При запуске клиента в момент исполнения первой строчки кода (часто глобальный модуль ''Module.sf''), если в [[Основной файл инициализации клиента|файле инициализации клиента]] активирован режим ''StartInDebugger''. При этом отладчик покажет текущий модуль и строку начала исполнения кода. Строка будет выделена красным цветом (цвет остановки по требованию) и в нее будет перемещен курсор.&lt;br /&gt;
* В момент, когда система встречает в программном модуле команду [[Debugbreak]]. При этом отладчик покажет текущий модуль и строку, которая вызвала остановку. Строка будет выделена красным цветом (цвет остановки по требованию) и в нее будет перемещен курсор.&lt;br /&gt;
* Если в программном тексте из отладчика установлены контрольные точки (см. ниже), в т.ч. точки по условию или прерывание после выхода из текущего уровня и пр., отладчик будет открыт (если разработчик успел его закрыть) и покажет текущий модуль и строку, которая вызвала остановку. Строка будет выделена красным цветом (цвет остановки по требованию) и в нее будет перемещен курсор.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=989px heights=554px&amp;gt;&lt;br /&gt;
Debugger 1.png||Рис. 1. Общий вид окна встроенного отладчика&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Отладчик выполнен в виде отдельного окна, располагающегося над основным окном клиента. При наличии второго монитора, удобно помещать окно отладчика на второй монитор. На рис. 1 показаны основные элементы окна отладчика, которые включают:&lt;br /&gt;
# Главное меню окна отладчика. Меню содержит следующие пункты:&lt;br /&gt;
#* Меню '''Файл''' содержит общие пункты меню:&lt;br /&gt;
#** '''Местоположение исходных текстов''' -- позволяет задать локальную папку проекта, для получения исходных текстов из этой папки. Обычно исходные тексты загружаются непосредственно с сервера, но если отладка происходит под учетной записью, не имеющей прав администратора, сервер не разрешит загрузку исходных текстов, и, в этом случае, можно дать указание на локальную папку, откуда эти тексты будут загружены в процессе отладки. Эта функция соответствует переменной ''AdditionalSourcePaths'' в файле инициализации клиента.&lt;br /&gt;
#** '''Выбрать рабочий поток...''' -- позволяет вывести диалог списка потоков, выполняющихся в данный момент (пункт 6 на рис. 1). При нажатии на кнопку &amp;quot;Остановить&amp;quot;, для выделенного потока будет добавлена точка остановки, которая сработает в момент, когда поток начнет выполнять любой код. В режиме ожидания поток остановить нельзя, так как в этом режиме поток не выполняет никакой код и ожидает наступления внешнего события или ввода данных пользователем. Кнопка '''Выбрать''' делает указанный поток текущим в отладчике (все вычисляемые выражения будут производиться в этом потоке). При остановке на по требованию, однако, текущий поток автоматически меняется на тот, в котором сработала точка остановки. В диалоге показано имя потока (создающееся из заголовка формы потока или пути к его модулю, если поток не имеет формы и текущий загруженный модуль потока.&lt;br /&gt;
#** '''Остановить все потоки и перезапустить систему''' (функция доступна только для консольных клиентов) -- вызывает перезапуск консольного клиента.&lt;br /&gt;
#** '''Остановить все потоки и завершить работу''' (функция доступна только для консольных клиентов) -- вызывает завершение работы консольного клиента.&lt;br /&gt;
#** '''Выйти из отладчика''' (&amp;lt;code&amp;gt;Ctrl+X&amp;lt;/code&amp;gt;) -- закрывает отладчик и продолжает выполнение, если оно было прервано для отладки.&lt;br /&gt;
#* Меню '''Действия''' содержит основные возможности точек остановки для отладки исходных текстов:&lt;br /&gt;
#** '''Искать''' (&amp;lt;code&amp;gt;Ctrl+F&amp;lt;/code&amp;gt;) -- выводит диалог поиска в исходном тексте, открытом в данный момент (см. [[Студия/Редактор модулей|Редактор модулей]]).&lt;br /&gt;
#** '''Искать далее''' (&amp;lt;code&amp;gt;Ctrl+L&amp;lt;/code&amp;gt;) -- продолжает поиск, инициированный ранее.&lt;br /&gt;
#** '''Переход к строке''' (&amp;lt;code&amp;gt;Ctrl+G&amp;lt;/code&amp;gt;) -- вызов диалога ввода номера строки, чтобы перейти к строке с указанным номером внутри активного исходного текста.&lt;br /&gt;
#** '''Переход к функции''' (&amp;lt;code&amp;gt;Ctrl+H&amp;lt;/code&amp;gt;) -- вызов диалога со списком функций текущего модуля для перехода к началу требуемой функции.&lt;br /&gt;
#** '''Добавить вычисляемое выражение''' (&amp;lt;code&amp;gt;Ctrl+F5&amp;lt;/code&amp;gt;) -- вызывает диалог вычисляемого выражения, который позволяет вычислить произвольное выражение в текущем потоке (см. ниже). &lt;br /&gt;
#** '''Исполнить произвольное выражение''' -- вызывает диалог исполнения произвольного выражения, которое может изменить переменные в текущем потоке, либо выполнить произвольные действия. Для работы диалога текущий поток отладчика должен находиться в режиме остановки по требованию.&lt;br /&gt;
#** '''Точка останова''' (&amp;lt;code&amp;gt;F2&amp;lt;/code&amp;gt;) -- добавляет или удаляет безусловную точку остановки по требованию в строке, в которой находится курсор. Точка остановки работает только для текущего потока, программа будет остановлена в момент когда исполняемый код достигнет строки с точкой остановки. Точки остановки отображаются красными кружками на левой панели окна исходной текста (пункт 4 рис. 1).&lt;br /&gt;
#** '''Точка останова с условием''' (&amp;lt;code&amp;gt;Ctrl+F2&amp;lt;/code&amp;gt;) -- добавляет или удаляет точку остановки по требованию с дополнительным условием в строке, в которой находится курсор. Точка остановки работает только для текущего потока, программа будет остановлена в момент когда исполняемый код достигнет строки с точкой остановки и выполнение условия вернет положительный ответ (целое число с младшим битом равным единице). Такие точки остановки работают медленнее и будут замедлять выполнение программы, если они находится внутри критического цикла с большим количеством обращений. Если условие задано неверно, оно не будет работать. Для просмотра или изменения условия, необходимо снова выбрать этот пункт меню (или ''Ctrl+F2'') в строке с точкой остановки. Точки остановки отображаются красными кружками со знаком вопроса внутри на левой панели окна исходной текста (пункт 4 рис. 1).&lt;br /&gt;
#** '''Отключить точку останова''' (&amp;lt;code&amp;gt;Alt+F2&amp;lt;/code&amp;gt;) -- отключает или включает точку остановки. В отключенном состоянии точка не будет вызывать остановку. Для ее включения, выберите пункт повторно. Отключенные точки остановки отображаются серыми кружками на левой панели окна исходной текста (пункт 4 рис. 1).&lt;br /&gt;
#** '''Удалить все точки останова''' -- пункт позволяет удалить все точки остановки, даже те, которые не относятся к текущему потоку.&lt;br /&gt;
#** '''Список точек останова''' -- выводит диалог с полным списком текущих точек остановки (в том числе отключенных) и модулей, в которых эти точки установлены. С помощью двойного клика мыши, можно перейти к исходному тексту в строку выделенной точкой остановки.&lt;br /&gt;
#* Меню '''Отладка''' содержит дополнительные возможности отладки исходных текстов:&lt;br /&gt;
#** '''Продолжить''' (&amp;lt;code&amp;gt;F9&amp;lt;/code&amp;gt;) -- используется для продолжения исполнения, если оно было прервано точкой остановки, прерыванием или остановкой по требованию. Окно отладчика при этом закрыто не будет.&lt;br /&gt;
#** '''Остановить''' (&amp;lt;code&amp;gt;Ctrl+C&amp;lt;/code&amp;gt;) -- используется для инициации остановки по требованию в текущем выбранном потоке. Если поток исполняет код в данный момент, он будет остановлен сразу и курсор будет перемещен на строку, в которой сейчас происходит исполнение. Если поток находится в режиме ожиданий пользователя, он будет остановлен, как только произойдет любое событие, внутри обработчика этого события.&lt;br /&gt;
#** '''Шагнуть через''' (&amp;lt;code&amp;gt;F8&amp;lt;/code&amp;gt;) -- используется для инициации остановки по требованию в следующей встреченной строке кода, после строки, на которой в данный момент остановлено исполнение. Если в текущей строке находится вызов функций, остановка не будет инициирована на их коде. Т.е., остановка пропускает любой код который будет инициировать увеличение стека по сравнению с текущим и останавливается на следующей строке кода на текущем уровне вложенности или при выходе из текущей функции. После установки точки остановки по требованию, исполнение в текущем потоке будет продолжено.&lt;br /&gt;
#** '''Шагнуть в''' (&amp;lt;code&amp;gt;F7&amp;lt;/code&amp;gt;) -- используется для инициации остановки по требованию в следующей встреченной строке кода, после строки, на которой в данный момент остановлено исполнение. Вне зависимости от уровня вложенности, исполнение будет остановлено при любом изменении строки исполнения. После установки точки остановки по требованию, исполнение в текущем потоке будет продолжено.&lt;br /&gt;
#** '''Шагнуть из''' (&amp;lt;code&amp;gt;Shift+F7&amp;lt;/code&amp;gt;) -- используется для инициации остановки по требованию в следующей встреченной строке кода, после выхода из функции, на которой в данный момент остановлено исполнение. После установки точки остановки по требованию, исполнение в текущем потоке будет продолжено.&lt;br /&gt;
#** '''Идти до курсора''' (&amp;lt;code&amp;gt;F4&amp;lt;/code&amp;gt;) -- используется для инициации остановки по требованию в строке, в которой в данный момент находится курсор. После установки точки остановки по требованию, исполнение в текущем потоке будет продолжено.&lt;br /&gt;
#** '''Перейти на текущую строку''' (&amp;lt;code&amp;gt;INS&amp;lt;/code&amp;gt;) -- используется мгновенной установки курсора на строку, на которой произошла остановка текущего потока (курсор исполнения).&lt;br /&gt;
#** '''Идти до следующего открытия модуля''' -- используется для инициации остановки по требованию в первой же строке кода любого нового модуля, загруженного в текущем или новом потоке. После установки точки остановки по требованию, исполнение в текущем потоке будет продолжено.&lt;br /&gt;
#** '''Останавливаться на исключениях''' -- пункт помогает изменить состояние глобальной установки клиента, когда любое исключение будет вызывать открытие отладчика. Состояние этой установки по умолчанию задается ''BreakOnExceptions'' в [[Основной файл инициализации клиента|основном файле инициализации клиента]].&lt;br /&gt;
#* Меню '''Профайлер''' содержит возможности профилирования исходных текстов. Меню доступно, только если текущий поток в данный момент остановлен. Для описания пунктов меню и возможностей профилирования, см. статью [[Встроенный профайлер]].&lt;br /&gt;
#* Меню '''Окна''' содержит стандартные возможности по работе с открытыми в отладчике окнами исходных текстов.&lt;br /&gt;
#** '''Закрыть''' (&amp;lt;code&amp;gt;Ctrl+F4&amp;lt;/code&amp;gt;) -- закрывает окно текущего модуля.&lt;br /&gt;
#** '''Закрыть все, кроме текущего''' -- помогает избавиться от большого количества окон с исходными текста, оставляя текущее рабочее окно открытым.&lt;br /&gt;
# Закладки окон исходных текстов. Закладки открываются автоматически отладчиком, если срабатывает остановка в коде из-за исключения, функции [[Debugbreak]], остановка по требованию, контрольная точка и т.д. В заголовке закладок дается полное имя модуля закладки. Для закрытия лишний окон можно использовать комбинацию &amp;lt;code&amp;gt;Ctrl+F4&amp;lt;/code&amp;gt; или меню правой клавиши мыши при клике на заголовке закладки.&lt;br /&gt;
# Панель вычисляемых выражений содержит выражения, добавленные с помощью диалога вычисляемого выражения (&amp;lt;code&amp;gt;Ctrl+F5&amp;lt;/code&amp;gt;). Значение всех выражений будет обновлено в момент, когда поток будет остановлен (т.е., для функции &amp;quot;шага&amp;quot; по исходному тексту (&amp;lt;code&amp;gt;F8&amp;lt;/code&amp;gt;) -- после каждого шага). Большое количество выражений может замедлить отладку. Если в выражении найдена ошибка, ее описание будет выведено вместо результата вычисления выражения. Правое меню мыши панели позволяет осуществлять следующие действия с выражениями:&lt;br /&gt;
#* '''Добавить выражение''' -- выводит диалог вычисляемого выражения, в котором можно задать новое выражение и добавить его в панель.&lt;br /&gt;
#* '''Редактировать выражение''' -- выводит диалог вычисляемого выражения, заполненный текущим выражением под курсором, вместо добавления нового выражения, этот диалог будет менять текущее.&lt;br /&gt;
#* '''Удалить выражение''' (&amp;lt;code&amp;gt;DEL&amp;lt;/code&amp;gt;) -- позволяет удалить выделенное выражение из панели.&lt;br /&gt;
#* '''Удалить все выражения''' -- позволяет удалить все выражения из панели.&lt;br /&gt;
# Левая панель исходного текста содержит метки закладок текста, точек остановки или информацию о результатах профилирования для каждой из строк. Для информации по профилированию, см. статью [[Встроенный профайлер]].&lt;br /&gt;
# Окно исходных текстов содержит исходный текст в виде редактора исходных текстов, в котором запрещены изменения текста, см. статью [[Студия/Редактор модулей|Редактор модулей]]. Строка, в которой в данный момент произошла остановка исполнения выделяется красным цветом. Если в строке произошло также исключение, будет использовано выделение желтым цветом.&lt;br /&gt;
# Окно выбора рабочего потока выводится автоматически при открытии окна отладчика, либо с помощью главное меню. Окно показывает список выполняющихся в данный момент рабочих потоков, с возможностью инициировать остановку любого.&lt;br /&gt;
# Окно стека вызовов содержит список сложенных вызовов функций и модулей до момента текущей остановки. При двойном клике по элементу списка будет открыт соответствующий исходный текст и курсор перемещен к месту вызова.&lt;br /&gt;
# Панель исключений содержит все накопленные отладчиком исключения. Правое меню мыши позволяет перейти к исходному коду, вызвавшему исключение, очистить список исключений, или сохранить исключения в текстовый файл.&lt;br /&gt;
# Панель статуса отладчика служит для вывода различных статусов:&lt;br /&gt;
#* Статуса текущего (выбранного потока) -- работает, остановлен, в ожидании пользователя и т.д.&lt;br /&gt;
#* Положения курсора в окне исходного текста.&lt;br /&gt;
#* Наименование выбранного в данный момент потока (отладка именно этого потока выполняется в данный момент).&lt;br /&gt;
&lt;br /&gt;
== Диалог вычисляемого выражения ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=613px heights=548px&amp;gt;&lt;br /&gt;
Debugger 2.png||Рис. 2. Пример работы диалога при отображении объекта базы данных&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Диалог вычисляемого выражения позволяет не только вычислить результаты произвольного выражения в контексте текущего модуля текущего потока отладчика, но и представляет результат вычисления в виде удобного интерактивного дерева или таблицы. Представление изменяется в зависимости от типа объекта результата. Программист может просматривать свойства объекта, используя двойной клик мыши в нужном месте представления результата. Результат также можно добавить в панель вычисляемых выражений. Для работы диалога текущий поток отладчика должен находиться в режиме остановки по требованию. Диалог можно вызвать из главного меню окна отладчика, а также с помощью комбинации клавиш &amp;lt;code&amp;gt;Ctrl+F5&amp;lt;/code&amp;gt; (при это выделенный в данный момент фрагмент текста будет помещен в поле условие диалога). &lt;br /&gt;
&lt;br /&gt;
На рис. 2 показан пример работы диалога. Поле условие содержит сложное вычисляемое выражение, зависящее от текущего контекста ожидающего потока. При вычислении выражения отладчик получил результат -- объект базы данных, который представлен в рабочем окне представления результата. При выводе объекта используется дерево, в котором отображаются важные свойства [[Объект базы данных|объектов базы данных]]. Если объект был загружен, также будут отображены его реквизиты, строчные части и реквизиты строчных частей. При двойном клике на строки реквизитов или строки типа &amp;quot;род. справочник&amp;quot;, &amp;quot;род. папка&amp;quot;, поле &amp;quot;условие&amp;quot; будет автоматически изменено для отображения выбранного реквизита. Кроме объектов базы данных, интерактивное отображение также используется для других сложных объектов (список, таблица, дерево и т.д.).&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
</feed>