prog:: trace

Наблюдайте функции

Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.

Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразовывают Notebook MuPAD в Live скрипты MATLAB.

Синтаксис

prog::trace(obj, <Recursive = FALSE>)
prog::trace({obj1, obj2, …}, <Recursive = FALSE>)
prog::trace(options)

Описание

prog::trace(obj) управляет объектом obj MuPAD® наблюдать ввод и выход из этого объекта.

Примечание

prog::trace имеет новый синтаксис и новый набор опций. Старый синтаксис был удален.

prog::trace позволяет вам наблюдать функции, области, доменные методы и функциональные среды. Используйте функцию prog::trace для отладки. Смотрите Пример 1.

prog::trace позволяет вам задать набор функций, областей, методов или функциональных сред, которые вы хотите наблюдать. Смотрите Пример 2.

prog::trace позволяет вам наблюдать отношения между вызовами прослеженных объектов.

Чтобы проследить объект obj, используйте вызов функции prog::trace(obj). После того вызова, каждый раз, когда вызов функции вводит или выходит из объекта obj, MuPAD распечатывает сообщение и возвращает аргументы и возвращаемое значение того вызова. Смотрите Пример 3.

prog::trace позволяет вам наблюдать область или функциональную среду. Когда вы вызываете функцию prog::trace для области, функция наблюдает все методы области. Когда вы вызываете prog::trace для функциональной среды, он наблюдает все слоты функциональной среды. Чтобы проследить только конкретные методы (слоты), обеспечьте набор этих методов (слоты). Дополнительную информацию см. в странице справки slot. Смотрите Пример 8.

Чтобы предотвратить трассировку всех слотов функциональной среды, установите значение опции Recursive к FALSE. Смотрите Пример 7.

Функциональный prog::untrace(obj) отключает трассировку объекта obj. Здесь obj является функцией, набором функций, области, доменного метода или функциональной среды. Функциональный prog::traced обнаруживает, прослеживает ли система в настоящее время конкретный объект.

Примеры

Пример 1

Задайте функциональный f и наблюдайте эту функцию:

f := x -> if x > 0 then x else -f(-x) end:
prog::trace(f):
f(-2)
enter f(-2)
  enter f(2)
  computed 2
computed -2

Измените функцию и повторно присвойте новую функцию f. Несмотря на то, что вы используете то же имя функции (f), MuPAD не прослеживает новую функцию:

f := x -> if x > 0 then x else f(-x) end:
f(-2)

Чтобы проследить новую функцию, вызовите prog::trace снова. Теперь, механизм трассировки наблюдает обновленную функцию:

prog::trace(f):
f(-2)
enter f(-2)
  enter f(2)
  computed 2
computed 2

Для дальнейших вычислений остановите наблюдение за функцией:

prog::untrace(f)

Пример 2

Если вы хотите проследить больше чем одну функцию, используйте набор, чтобы задать эти функции в одном вызове функции:

prog::trace({sin, cos, exp}):
sin(5*PI/2);
cos(5*PI);
exp(5)
enter sin((5*PI)/2)
  enter sin(PI/2)
  remembered 1
computed 1


enter cos(5*PI)
  enter cos(PI)
  remembered -1
computed -1


enter exp(5)
computed exp(5)

Чтобы остановить наблюдение за всеми функциями, используйте prog::untrace без аргументов:

prog::untrace()

Пример 3

Задайте короткую функцию, которая вызывает себя рекурсивно, и наблюдайте вызовы:

fib:= proc(n)
      begin
        if n < 2 then
          n
        else
          fib(n - 1) + fib(n - 2)
        end_if
      end_proc:
prog::trace(fib):
fib(3)
enter fib(3)
  enter fib(2)
    enter fib(1)
    computed 1
    enter fib(0)
    computed 0
  computed 1
  enter fib(1)
  computed 1
computed 2

Чтобы ограничить количество вызовов вложенной функции, отображенных prog::trace, используйте опцию Depth. Чтобы задать значение Depth, используйте отдельный вызов функции prog::trace:

prog::trace(fib):
prog::trace(Depth = 2);
fib(12)
enter fib(12)
  enter fib(11)
  computed 89
  enter fib(10)
  computed 55
computed 144

Опция Depth независима от процедуры fib. Теперь, если вы используете prog::trace, чтобы проследить какую-либо другую процедуру, prog::trace отображает вложенные вызовы той процедуры с помощью Depth = 2. Удалите эту глобальную опцию для дальнейших вычислений:

prog::untrace(fib):
prog::trace(Depth = 0)

Пример 4

Чтобы отобразить использование памяти, используйте опцию Mem:

prog::trace(Mem):
prog::trace(sin):
sin(3/2*PI)
enter
remember::sin((3*PI)/2) [mem: 3267052]   enter remember::sin(PI/2)
[mem: 4033596]   remembered 1 [mem: 4033436] computed -1 [mem: 4033072]
   -1 

Опция Mem независима от прослеженной процедуры. Теперь, если вы используете prog::trace, чтобы проследить какую-либо другую процедуру, prog::trace отображает использование памяти на каждом шаге той процедуры. Удалите эту глобальную опцию для дальнейших вычислений::

prog::untrace(sin):
prog::trace(Mem = FALSE)

Пример 5

Опция NoArgs подавляет вывод аргументов прослеженных объектов:

prog::trace(linalg):
prog::trace(NoArgs);
linalg::eigenvalues(matrix([[1,  0, 0],
                            [0, -1, 2],
                            [0,  1, 1]]))
enter linalg::eigenvalues
  enter linalg::checkForFloats
  return
  enter linalg::charpoly
    enter linalg::charpolyBerkowitz
    return
  return
return

Опция NoArgs независима от прослеженной процедуры. Теперь, если вы используете prog::trace, чтобы проследить какую-либо другую процедуру, prog::trace скрывает аргументы на каждом шаге той процедуры. Удалите эту глобальную опцию для дальнейших вычислений:

prog::untrace(linalg):
prog::trace(NoArgs = FALSE)

Пример 6

Если вы используете опцию Parent, prog::trace показывает имя процедуры, которая вызывает прослеженный объект:

prog::trace(cos):
prog::trace(Parent):
f := x -> cos(2*x):
g := (x, y) -> f(x) + f(y):
g(3/2*PI, -3/2*PI)
enter cos(3*PI) (called from f)
  enter cos(PI) (called from cos)
  remembered -1
computed -1
enter cos(-3*PI) (called from f)
  enter cos(3*PI) (called from cos)
  remembered -1
computed -1

prog::trace(f):
prog::trace(g):
g(-PI, PI)
enter g(-PI, PI)
  enter f(-PI) (called from g)
    enter cos(-2*PI) (called from f)
      enter cos(2*PI) (called from cos)
        enter cos(0) (called from cos)
        remembered 1
      computed 1
    computed 1
  computed 1
  enter f(PI) (called from g)
    enter cos(2*PI) (called from f)
    remembered 1
  computed 1
computed 2

Опция Parent независима от прослеженных процедур. Теперь, если вы используете prog::trace, чтобы проследить какой-либо другой объект, prog::trace показывает отношения между вызовами прослеженных объектов. Удалите эту глобальную опцию для дальнейших вычислений:

prog::untrace(cos):
prog::trace(Parent = FALSE)

Пример 7

По умолчанию функция prog::trace прослеживает все слоты функциональной среды. Например, проследите besselJ, функционируют и наблюдают следующий вызов функции:

prog::trace(besselJ);
besselJ(1, 2.3)
enter besselJ(1, 2.3)
  enter besselJ::float(1, 2.3)
  computed 0.5398725326
computed 0.5398725326

Чтобы не использовать трассировку всех слотов, установите значение опции Recursive к FALSE:

prog::untrace(besselJ);
prog::trace(besselJ, Recursive=FALSE);
besselJ(1, 4.5)
enter besselJ(1, 4.5)
computed -0.2310604319

Для дальнейших вычислений остановите наблюдение за функцией besselJ:

prog::untrace(besselJ)

Пример 8

Можно проследить области и доменные методы. Например, создайте следующую маленькую область:

T := newDomain("T"):
T::new := proc(h, m = 0) name T; begin new(T, h*60 + m) end:
T::intern := x -> [op(x) div 60, op(x) mod 60]:
T::print := x -> expr2text(T::intern(x)[1]).":".
                 substring(expr2text(100 + T::intern(x)[2]), 2, 2):
T::_plus := () -> new(T, _plus(map(args(), op))):
T::expr := op:
T::_mult := () -> new(T, _mult(map(args(), expr))):
prog::trace(T):
T(1, 30) + T(0, 45)*T(1, 05)
enter T(1, 30)
computed 1:30
enter T(0, 45)
computed 0:45
enter T(1, 5)
computed 1:05
enter T::_mult(0:45, 1:05)
computed 48:45
enter T::_plus(1:30, 48:45)
computed 50:15

MuPAD не прослеживает процесс отображения прослеженных выводов. Поэтому T::intern и методы T::print не появляются в прослеженных выходных параметрах.

Теперь, проследите арифметические методы только. При определении методов, чтобы проследить, используйте их имена слота, такие как slot(T, "_plus") или T::_plus:

prog::untrace():
prog::trace({T::_plus, T::_mult}):
T(1, 30) + T(0, 45)*T(1, 05)
enter T::_mult(0:45, 1:05)
computed 48:45
enter T::_plus(1:30, 48:45)
computed 50:15

prog::untrace():

Параметры

obj

Функция MuPAD, область, метод или функциональная среда, чтобы наблюдать. Задайте методы их именами slot (строки).

{obj1, obj2, …}

Набор функций MuPAD, областей, методов или функциональных сред, чтобы наблюдать.

Опции

Depth

Опция, заданная как Depth = level

Отобразите вызовы вложенной функции только до глубины рекурсии level. Здесь level является положительным целым числом. После того, как вы устанавливаете эту опцию, все новые и регенерированные выходные параметры для прослеженных объектов показывают, что вложенная функция вызывает только до заданной глубины рекурсии. Смотрите Пример 3.

Mem

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

NoArgs

Не показывайте аргументы вызовов прослеженных объектов и возвращенных значений. Без этой опции все выходные параметры для прослеженных объектов показывают аргументы и возвращенные значения для каждого вызова прослеженного объекта. Смотрите Пример 5.

Parent

Покажите имя процедуры, которая вызывает прослеженный объект. После того, как вы устанавливаете эту опцию, все новые и регенерированные выходные параметры для прослеженных объектов показывают имена процедур, которые вызывают прослеженные объекты. Смотрите Пример 6.

Recursive

Опция, заданная как Recursive = FALSE

Не прослеживайте все слоты функциональной среды или области. По умолчанию, Recursive = TRUE. Смотрите Пример 7.

Возвращаемые значения

prog::trace возвращает пустой объект null().

Смотрите также

Функции MuPAD