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

Команда прерывания

Как правило, выполнение сценария прекращается при появлении ошибки, исключительной ситуации или при срабатывании оператора throw. Например, всякая попытка получить доступ к свойству неопределенной переменной приводит к ошибке, а попытка выполнить деление на нуль — к исключительной ситуации и останову сценария. Метод throw также приводит к приостановке выполнения


Приложение

сценария. В отладчике внедрен новый метод, позволяющий останавливать или прерывать выполнение сценария вручную. Это так называемая функция прерывания, или контрольного останова. Её синтаксис довольно прост:

<ok> Break()

Данная функция возвращает постоянное значение "OK" и не воспринимает па­раметры, а просто останавливает выполнение сценария в данной точке. Если окно отладчика настроено на открытие по команде прерывания, то оно открывается при остановке сценария.

Если выполнение сценария прекращается по ошибке или контрольному останову, информация о сценарии выводится из отладчика в специальное окно DebuggerOutputWindow. При этом отладчик запрещает доступ к пользовательскому ин­терфейсу 3dsMax, приемнику команд и любым открытым окнам редактора MAXScript Editor.

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

1. Установите 3dsMax в исходное состояние.

2. Откройте сначала отладчик, а затем диалоговое окно Debugger Parameters.

3. Установите флажок Stay On Top.

4. Откройте новое окно редактора сценариев и введите следующий фрагмент кода:

(

a = 0

for i = 1 to 10 do

(

a += 1.5

ss = i * 2

if ss == 18 do break()

)

)

5. Сохраните сценарий в файле debugger.ms.

6. Вычислите сценарий.

Когда индекс цикла for достигнет 9, значение переменной ss станет равным 18 и будет вызвана команда прерывания. Затем в окне вывода из отладчика появится следующая информация:

#

**thread data: threadID:2848

**[stacklevel: 0]

**In i loop; filename: C:\Program Files\3DSMax8\Scripts\debugger.ms; position: 89

**member of: anonymous codeblock

--Parameters:

--i: 9

--Locals:

--SS:18


Приложение

--i: 9

--Externals:

--owner: <CodeBlock: anonymous>

--a: 13.5

--Owner:

--Locals:

--a: 13.5

--Externals:

**[stack level: 1]

**called from anonymous codeblock; filename: C:\Program

Files\3DSMax8\Scripts\debugger.ms; position: 93

--Locals:

--a: 13.5

--Externals:

**[stack level: 2]

**calledfromtop-level

Первая строка результатов отладки содержит идентификационный номер 2848 текущего потока (у вас этот номер может быть другим). Чаще всего идентификационные номера потоков не нужны для отладки, поэтому они здесь и не рас­сматриваются. Далее выводятся все уровни и кадры стека, называемые также блоками кода, заключенного в круглые скобки. Для каждого блока кода в MAXScript создается отдельный кадр стека, располагаемый в том порядке, в каком данный блок кода вызывается. Каждый кадр стека нумеруется начиная с нуля, соответст­вующего вершине стека (или последнему блоку кода). Таким образом, результаты отладки показывают, что прерывание сценария произошло в следующей строке кода:

**[stacklevel: 0]

Этот кадр стека связан с циклом for. Поэтому цикл for указывается во второй строке результатов отладки:

**In i loop; filename: C:\Program Files\3DSMax8\Scripts\debugger.ms; position: 89

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

В последующих строках результатов отладки перечисляются различные переменные, используемые в данном цикле for.

• Под заголовком Parameters перечисляются любые параметры текущего блока кода. В данном случае индекс цикла i считается параметром блока кода, и поэтому указывается его значение 9.

• Под заголовком Locals перечисляются любые локальные переменные, определенные внутри текущего блока кода. В данном случае перечислены переменные i и ss, а также их значения 9 и 18 соответственно.

• Под заголовком Externals перечисляются любые внешние переменные из более обширной области действия, которые используются внутри текущего цикла for. В данном случае внешняя переменная a имеет локальную область действия и получает приращение на каждом шаге цикла for (ее значение равно 13,5).


Приложение

• Под заголовком Owner указывается владелец текущего блока кода. В данном случае сценарий выполнялся внутри пары круглых скобок. Такой блок кода называется анонимным, поскольку у него нет имени. Если бы это был конкретный сценарий Macro Script, у него было бы имя категории Macro Script и присоединяемое к нему через символ подчеркивания имя сценария Macro Script.

После содержимого кадра стека нулевого уровня перечисляется содержимое выполнявшегося ранее кадра стека уровня 1, т.е. того блока кода, из которого вы­зывался цикл for:

**[stacklevel: 1]

Об этом свидетельствует следующая строка:

**called from anonymous codeblock; filename: C:\Program Files\3DSMax8\Scripts\debugger.ms; position: 93

Далее указывается содержимое второго уровня стека, который соответствует глобальной области действия и называется верхним уровнем:

**[stack level: 2]

**called from top-level