@c Language: Brazilian Portuguese, Encoding: iso-8859-1
@c /Debugging.texi/1.19/Sat Jun  2 00:12:37 2007/-ko/
@c end concepts Debugging
@menu
* Depurando o C@'{o}digo Fonte::
* Comandos Palavra Chave::
* Fun@value{cedilha}@~{o}es e Vari@'{a}veis Definidas para Depura@value{cedilha}@~{a}o::   
@end menu

@node Depurando o C@'{o}digo Fonte, Comandos Palavra Chave, , Depurando
@section Depurando o C@'{o}digo Fonte

Maxima tem um depurador interno de c@'{o}digo fonte.  
O usu@'{a}rio pode escolher um ponto de parada em uma fun@value{cedilha}@~{a}o,
e ent@~{a}o caminhar linha por linha a partir da@'{i}.  A pilha de
chamadas po ser examinada, juntamente com as vari@'{a}veis associadas @`aquele
n@'{i}vel.

O comando @code{:help} ou @code{:h} mostra a lista de comando de depura@value{cedilha}@~{a}o.
(Em geral,
comandos podem ser abreviados se a abrevia@value{cedilha}@~{a}o for @'{u}nica.  Se n@~{a}o for
@'{u}nica, as alternativas podem ser listadas.)
Dentro do depurador, o usu@'{a}rio pode tamb@'{e}m usar qualquer fun@value{cedilha}@~{o}es comuns
do Maxima para examinar, definir, e manipular vari@'{a}veis e express@~{o}es.

Um ponto de parada @'{e} escolhido atrav@'{e}s do comando @code{:br} na linha de comando do Maxima.
Dentro do depurador,
o usu@'{a}rio pode avan@value{cedilha}ar uma linha de cada vez usando o comando @code{:n} (``next'').
o comando @code{:bt} (``backtrace'') mostra uma lista da pilha de frames.
O comando @code{:r} (``resume'') sai do depurador e continua com a execu@value{cedilha}@~{a}o.
Esses comandos s@~{a}o demostrados no exemplo abaixo.

@example
(%i1) load ("/tmp/foobar.mac");

(%o1)                           /tmp/foobar.mac

(%i2) :br foo
Turning on debugging debugmode(true)
Bkpt 0 for foo (in /tmp/foobar.mac line 1) 

(%i2) bar (2,3);
Bkpt 0:(foobar.mac 1)
/tmp/foobar.mac:1::

(dbm:1) :bt                        <-- :bt digitado aqui lista os frames
#0: foo(y=5)(foobar.mac line 1)
#1: bar(x=2,y=3)(foobar.mac line 9)

(dbm:1) :n                         <-- Aqui digite :n para avan@value{cedilha}ar linha
(foobar.mac 2)
/tmp/foobar.mac:2::

(dbm:1) :n                         <-- Aqui digite :n para avan@value{cedilha}ar linha
(foobar.mac 3)
/tmp/foobar.mac:3::

(dbm:1) u;                         <-- Investiga o valor de u
28

(dbm:1) u: 33;                     <-- Altera u para ser 33
33

(dbm:1) :r                         <-- Digite :r para retomar a computa@value{cedilha}@~{a}o

(%o2)                                1094
@end example

O arquivo @code{/tmp/foobar.mac} @'{e} o seguinte:

@example
foo(y) := block ([u:y^2],
  u: u+3,
  u: u^2,
  u);
 
bar(x,y) := (
  x: x+2,
  y: y+2,
  x: foo(y),
  x+y);
@end example

USO DO DEPURADOR ATRAV@'{E}S DO EMACS

Se o usu@'{a}rio estiver rodando o c@'{o}digo sob o GNU emacs em uma janela
shell (shell dbl), ou est@'{a} rodando a vers@~{a}o de interface gr@'{a}fica,
Xmaxima, ent@~{a}o se ele para em um ponto de parada, ele ver@'{a} sua
posi@value{cedilha}@~{a}o corrente no arquivo fonte a qua ser@'{a} mostrada na
outra metade da janela, ou em vermelho brilhante, ou com um pequeno
seta apontando na direita da linha.  Ele pode avan@value{cedilha}ar uma linha por
vez digitando M-n (Alt-n).

Sob Emacs voc@^{e} pode executar em um shell @code{dbl}, o qual requer o
arquivo @code{dbl.el} no diret@'{o}rio elisp.
Tenha certeza que instalou os arquivos elisp ou adicionou o diret@'{o}rio elisp do Macima ao
seu caminho:
e.g., adicione o seguinte ao seu arquivo @file{.emacs} ou ao seu arquivo @file{site-init.el}

@example
(setq load-path (cons "/usr/share/maxima/5.9.1/emacs" load-path))
(autoload 'dbl "dbl")
@end example

ent@~{a}o no emacs 

@example
M-x dbl
@end example

pode iniciar uma janela shell na qual voc@^{e} pode executar programas, por exemplo
Maxima, gcl, gdb etc.   Essa janela de shell tamb@'{e}m reconhece informa@value{cedilha}@~{o}es sobre depura@value{cedilha}@~{a}o de
c@'{o}digo fonte, e mostra o c@'{o}digo fonte em outra janela.  

O usu@'{a}rio pode escolher um ponto de parada em certa linha do
arquivo digitando @code{C-x space}.  Isso encontra qual a fun@value{cedilha}@~{a}o
que o cursor est@'{a} posicionado, e ent@~{a}o mostra qual a linha daquela fun@value{cedilha}@~{a}o
que o cursor est@'{a} habilitado.   Se o cursor estiver habilitado, digamos, na linha 2 de @code{foo}, ent@~{a}o isso ir@'{a}
inserir na outra janela o comando, ``@code{:br foo 2}'', para
parar @code{foo} nessa segunda linha.   Para ter isso habilitado, o usu@'{a}rio deve ter
maxima-mode.el habilitado na janela na qual o arquivo @code{foobar.mac} estiver interagindo.
Existe comandos adicional dispon@'{i}veis naquela janela de arquivo, tais como
avaliando a fun@value{cedilha}@~{a}o dentro do Maxima, atrav@'{e}s da digita@value{cedilha}@~{a}o de @code{Alt-Control-x}.

@node Comandos Palavra Chave, Fun@value{cedilha}@~{o}es e Vari@'{a}veis Definidas para Depura@value{cedilha}@~{a}o, Depurando o C@'{o}digo Fonte, Depurando
@section Comandos Palavra Chave

Comandos palavra chave s@~{a}o palavras chaves especiais que n@~{a}o s@~{a}o interpretadas como express@~{o}es do Maxima.
Um comando palavra chave pode ser inserido na linha de comando do Maxima ou na linha de comando do depurador,
embora n@~{a}o possa ser inserido na linha de comando de parada.
Comandos palavra chave iniciam com um dois pontos, @code{:}.
Por exemplo, para avaliar uma forma Lisp voc@^{e}
pode digitar @code{:lisp} seguido pela forma a ser avaliada.  

@example
(%i1) :lisp (+ 2 3) 
5
@end example

O n@'{u}mero de argumentos tomados depende do comando em particular.  Tamb@'{e}m,
voc@^{e} n@~{a}o precisa digitar o comando completo, apenas o suficiente para ser @'{u}nico no meio
das palavras chave de parada.   Dessa forma @code{:br} ser@'{a} suficiente para @code{:break}.

Os comandos de palavra chave s@~{a}o listados abaixo.

@table @code
@item :break F n
Escolhe um ponto de parada em uma fun@value{cedilha}@~{a}o @code{F} na linha @code{n} 
a partir do in@'{i}cio da fun@value{cedilha}@~{a}o.
Se @code{F} for dado como uma seq@"{u}@^{e}ncia de caracteres, ent@~{a}o essa seq@"{u}@^{e}ncia de caracteres @'{e} assumida referir-se a
um arquivo, e @code{n} @'{e} o deslocamente a partir do in@'{i}cio do arquivo.
O deslocamento @'{e} opcional. Se for omitido, @'{e} assumido ser zero
(primeira linha da fun@value{cedilha}@~{a}o ou do arquivo).
@item :bt
Imprime na tela uma lista da pilha de frames
@item :continue
Continua a computa@value{cedilha}@~{a}o
@c CAN'T SEEM TO GET :delete TO WORK !!!
@item :delete
Remove o ponto de parada selecionado, ou todos se nenum for especificado
@c CAN'T SEEM TO GET :disable TO WORK !!!
@item :disable
Desabilita os pontos de parada selecionados, ou todos se nenhum for especificado
@c CAN'T SEEM TO GET :enable TO WORK !!!
@item :enable
Habilita os pontos de de parada especificados, ou todos se nenhum for especificado
@item :frame n
Imprime na tela a pilha de frame @code{n}, ou o corrente frame se nenhum for especificado
@c CAN'T SEEM TO GET :help TO WORK !!!
@item :help
Imprime na tela a ajuda sobre um comando do depurador, ou todos os comandos se nenhum for especificado
@c CAN'T SEEM TO GET :info TO WORK !!!
@item :info
Imprime na tela informa@value{cedilha}@~{o}es sobre um item
@item :lisp alguma-forma
Avalia @code{alguma-forma} como uma forma Lisp
@item :lisp-quiet alguma-forma
Avalia a forma Lisp @code{alguma-forma} sem qualquer sa@'{i}da
@item :next
Como @code{:step}, exceto @code{:next} passos sobre chamadas de fu@value{cedilha}@~{a}o
@item :quit
Sai do n@'{i}vel corrente do depurador sem concluir a computa@value{cedilha}@~{a}o
@item :resume
Continua a computa@value{cedilha}@~{a}o
@item :step
Continua a computa@value{cedilha}@~{a}o at@'{e} encontraruma nova linha de c@'{o}dico
@item :top
Retorne para a linha de comando do Maxima (saindo de qualquer n@'{i}vel do depurador) sem 
completar a computa@value{cedilha}@~{a}o
@end table 


@node Fun@value{cedilha}@~{o}es e Vari@'{a}veis Definidas para Depura@value{cedilha}@~{a}o, , Comandos Palavra Chave, Depurando
@section Fun@value{cedilha}@~{o}es e Vari@'{a}veis Definidas para Depura@value{cedilha}@~{a}o

@defvr {Vari@'{a}vel de op@value{cedilha}@~{a}o} refcheck
Valor padr@~{a}o: @code{false}

Quando @code{refcheck} for @code{true}, Maxima imprime uma mensagem
cada vez que uma vari@'{a}vel associada for usada pela primeira vez em uma
computa@value{cedilha}@~{a}o.

@end defvr

@defvr {Vari@'{a}vel de op@value{cedilha}@~{a}o} setcheck
Valor padr@~{a}o: @code{false}

Se @code{setcheck} for escolhido para uma lista de vari@'{a}veis (as quais podem
ser subscritas), 
Maxima mostra uma mensagem quando as vari@'{a}veis, ou
ocorr@^{e}ncias subscritas delas, forem associadas com o
operador comum de atribui@value{cedilha}@~{a}o @code{:}, o operador @code{::}
de atribui@value{cedilha}@~{a}o, ou associando argumentos de fun@value{cedilha}@~{a}o,
mas n@~{a}o com o operador de atribui@value{cedilha}@~{a}o de fun@value{cedilha}@~{a}o @code{:=} nem o operador de atribui@value{cedilha}@~{a}o
@code{::=} de macro.
A mensagem compreende o nome das vari@'{a}veis e o
valor associado a ela.

@code{setcheck} pode ser escolhida para @code{all} ou @code{true} incluindo
desse modo todas as vari@'{a}veis.

Cada nova atribui@value{cedilha}@~{a}o de @code{setcheck} estabelece uma nova lista de vari@'{a}veis
para verificar, e quaisquer vari@'{a}veis previamente atribu@'{i}das a @code{setcheck} s@~{a}o esquecidas.

Os nomes atribu@'{i}dos a @code{setcheck} devem ter um ap@'{o}strofo no in@'{i}cio se eles forem de outra forma
avaliam para alguma outra coisa que n@~{a}o eles mesmo.
Por exemplo, se @code{x}, @code{y}, e @code{z} estiverem atualmente associados, ent@~{a}o digite

@example
setcheck: ['x, 'y, 'z]$
@end example

para coloc@'{a}-los na lista de vari@'{a}veis monitoradas.

Nenhuma sa@'{i}da @'{e} gerada quando uma
vari@'{a}vel na lista @code{setcheck} for atribu@'{i}da a s@'{i} mesma, e.g., @code{X: 'X}.

@end defvr

@defvr {Vari@'{a}vel de op@value{cedilha}@~{a}o} setcheckbreak
Valor padr@~{a}o: @code{false}

Quando @code{setcheckbreak} for @code{true},
Maxima mostrar@'{a} um ponto de parada 
quando uma vari@'{a}vel sob a lista @code{setcheck} for atribu@'{i}da a um novo valor.
A parada ocorre antes que a atribu@'{i}@value{cedilha}@~{a}o seja conclu@'{i}da.
Nesse ponto, @code{setval} ret@'{e}m o valor para o qual a vari@'{a}vel est@'{a} 
para ser atribu@'{i}da.
Conseq@"{u}entemente, se pode atribuir um valor diferente atrav@'{e}s da atribui@value{cedilha}@~{a}o a @code{setval}.

Veja tamb@'{e}m @code{setcheck} e @code{setval}.

@end defvr

@defvr {Vari@'{a}vel de sistema} setval
Mant@'{e}m o valor para o qual a vari@'{a}vel est@'{a} para ser escolhida quando
um @code{setcheckbreak} ocorrer.
Conseq@"{u}entemente, se pode atribuir um valor diferente atrav@'{e}s da atribui@value{cedilha}@~{a}o a @code{setval}.

Veja tamb@'{e}m @code{setcheck} e @code{setcheckbreak}.

@end defvr

@deffn {Fun@value{cedilha}@~{a}o} timer (@var{f_1}, ..., @var{f_n})
@deffnx {Fun@value{cedilha}@~{a}o} timer (all)
@deffnx {Fun@value{cedilha}@~{a}o} timer ()
Dadas as fun@value{cedilha}@~{o}es @var{f_1}, ..., @var{f_n},
@code{timer} coloca cada uma na lista de fun@value{cedilha}@~{o}es para as quais cronometragens estat@'{i}sticas s@~{a}o coletadas.
@code{timer(f)$ timer(g)$} coloca @code{f} e ent@~{a}o @code{g} sobre a lista;
a lista acumula de uma chamada para a chamada seguinte.

@code{timer(all)} coloca todas as fun@value{cedilha}@~{o}es definidas pelo usu@'{a}rio (a saber pela vari@'{a}vel global @code{functions})
na lista de fun@value{cedilha}@~{o}es monitoradas pela fun@value{cedilha}@~{a}o @code{time}.

Sem argumentos, 
@code{timer} retorna a lista das fun@value{cedilha}@~{o}es tempo estatisticamente monitoradas.

Maxima armazena quanto tempo @'{e} empregado executando cada fun@value{cedilha}@~{a}o
na lista de fun@value{cedilha}@~{o}es tempo estatisticamente monitoradas.
@code{timer_info} retorna a coronometragem estat@'{i}stica, incluindo o
tempo m@'{e}dio decorrido por chamada de fun@value{cedilha}@~{a}o, o n@'{u}mero de chamadas, e o
tempo total decorrido.
@code{untimer} remove fun@value{cedilha}@~{o}es da lista de fun@value{cedilha}@~{o}es tempo estatisticamente monitoradas.

@code{timer} n@~{a}o avalia seus argumentos. 
@code{f(x) := x^2$ g:f$ timer(g)$} n@~{a}o coloca @code{f} na lista de fun@value{cedilha}@~{o}es estatisticamente monitoradas.

Se @code{trace(f)} est@'{a} vigorando, ent@~{a}o @code{timer(f)} n@~{a}o tem efeito; @code{trace} e
@code{timer} n@~{a}o podem ambas atuarem ao mesmo tempo.

Veja tamb@'{e}m @code{timer_devalue}.

@end deffn
@deffn {Fun@value{cedilha}@~{a}o} untimer (@var{f_1}, ..., @var{f_n})
@deffnx {Fun@value{cedilha}@~{a}o} untimer ()
Dadas as fun@value{cedilha}@~{o}es @var{f_1}, ..., @var{f_n},
@code{untimer} remove cada uma das fun@value{cedilha}@~{o}es listadas da lista de fun@value{cedilha}@~{o}es estatisticamente monitoradas.

Sem argumentos, @code{untimer} remove todas as fun@value{cedilha}@~{o}es atualmente na  lista de fun@value{cedilha}@~{o}es estatisticamente monitoradas.

Ap@'{o}s @code{untimer (f)} ser executada, @code{timer_info (f)} ainda retorna
estatisticas de tempo previamente coletadas,
embora @code{timer_info()} (sem argumentos) n@~{a}o
retorna informa@value{cedilha}@~{o}es sobre qualquer fun@value{cedilha}@~{a}o que n@~{a}o estiver atualmente na lista de fun@value{cedilha}@~{o}es tempo estatisticamente monitoradas.
@code{timer (f)} reposiciona todas as estatisticas de tempo para zero
e coloca @code{f} na lista de fun@value{cedilha}@~{o}es estatisticamente monitoradas novamente.

@end deffn

@defvr {Vari@'{a}vel de op@value{cedilha}@~{a}o} timer_devalue
Valor Padr@~{a}o: @code{false}

Quando @code{timer_devalue} for @code{true}, Maxima subtrai de cada fun@value{cedilha}@~{a}o estatisticamente monitorada
o tempo empregado em ou fun@value{cedilha}@~{o}es estatisticamente monitoradas. De outra forma, o tempo reportado 
para cada fun@value{cedilha}@~{a}o inclui o tempo empregado em outras fun@value{cedilha}@~{o}es.
Note que tempo empregado em fun@value{cedilha}@~{o}es n@~{a}o estatisticamente monitoradas n@~{a}o @'{e} subtra@'{i}do do
tempo total.

Veja tamb@'{e}m @code{timer} e @code{timer_info}.

@end defvr

@deffn {Fun@value{cedilha}@~{a}o} timer_info (@var{f_1}, ..., @var{f_n})
@deffnx {Fun@value{cedilha}@~{a}o} timer_info ()
Dadas as fun@value{cedilha}@~{o}es @var{f_1}, ..., @var{f_n},
@code{timer_info} retorna uma matriz contendo informa@value{cedilha}@~{o}es de cronometragem para cada fun@value{cedilha}@~{a}o.
Sem argumentos, @code{timer_info} retorna informa@value{cedilha}@~{o}es de cronometragem para
todas as fun@value{cedilha}@~{o}es atualmente na lista de fun@value{cedilha}@~{o}es estatisticamente monitoradas.

A matriz retornada atrav@'{e}s de @code{timer_info} cont@'{e}m o nome da fun@value{cedilha}@~{a}o,
tempo por chamda de fun@value{cedilha}@~{a}o, n@'{u}mero de chamadas a fun@value{cedilha}@~{o}es,tempo total,
e @code{gctime}, cujja forma "tempo de descarte" no Macsyma original
mas agora @'{e} sempre zero.

Os dados sobre os quais @code{timer_info} constr@'{o}i seu valor de retorno
podem tamb@'{e}m serem obtidos atrav@'{e}s da fun@value{cedilha}@~{a}o @code{get}:

@example
get(f, 'calls);  get(f, 'runtime);  get(f, 'gctime);
@end example

Veja tamb@'{e}m @code{timer}.

@end deffn

@deffn {Fun@value{cedilha}@~{a}o} trace (@var{f_1}, ..., @var{f_n})
@deffnx {Fun@value{cedilha}@~{a}o} trace (all)
@deffnx {Fun@value{cedilha}@~{a}o} trace ()
Dadas as fun@value{cedilha}@~{o}es @var{f_1}, ..., @var{f_n},
@code{trace} instrui Maxima para mostrar
informa@value{cedilha}@~{o}es de depura@value{cedilha}@~{a}o quando essas fun@value{cedilha}@~{o}es forem chamadas.
@code{trace(f)$ trace(g)$} coloca @code{f} e ent@~{a}o @code{g} na lista de fun@value{cedilha}@~{o}es
para serem colocadas sob a a@value{cedilha}@~{a}o de @code{trace}; a lista acumula de uma chamada para a seguinte.

@code{trace(all)} coloca todas as fun@value{cedilha}@~{o}es definidas pelo usu@'{a}rio (a saber pela vari@'{a}vel global @code{functions})
na lista de fun@value{cedilha}@~{o}es a serem monitoradas pela fun@value{cedilha}@~{a}o @code{trace}.

Sem argumentos,
@code{trace} retorna uma lista de todas as fun@value{cedilha}@~{o}es atualmente sob a a@value{cedilha}@~{a}o de @code{trace}.

A fun@value{cedilha}@~{a}o @code{untrace} desabilita a a@value{cedilha}@~{a}o de @code{trace}.
Veja tamb@'{e}m @code{trace_options}. 

@code{trace} n@~{a}o avalia seus argumentos. Dessa forma,
@code{f(x) := x^2$ g:f$ trace(g)$} n@~{a}o coloca @code{f} sobre a lista de fun@value{cedilha}@~{o}es monitoradas pela fun@value{cedilha}@~{a}o @code{trace}.

Quando uma fun@value{cedilha}@~{a}o for redefinida, ela @'{e} removida da lista de @code{timer}.
Dessa forma ap@'{o}s @code{timer(f)$ f(x) := x^2$},
a fun@value{cedilha}@~{a}o @code{f} n@~{a}o mais est@'{a} na lista de @code{timer}.

Se @code{timer (f)} estiver em efeito, ent@~{a}o @code{trace (f)} n@~{a}o est@'{a} agindo; @code{trace} e
@code{timer} n@~{a}o podem ambas estar agindo para a mesma fun@value{cedilha}@~{a}o.

@end deffn

@deffn {Fun@value{cedilha}@~{a}o} trace_options (@var{f}, @var{option_1}, ..., @var{option_n})
@deffnx {Fun@value{cedilha}@~{a}o} trace_options (@var{f})
Escolhe as op@value{cedilha}@~{o}es de @code{trace} para a fun@value{cedilha}@~{a}o @var{f}.
Quaisquer op@value{cedilha}@~{o}es anteriores s@~{a}o substitu@'{i}das.
@code{trace_options (@var{f}, ...)} n@~{a}o tem efeito a menos que
@code{trace (@var{f})} tenha sido tamb@'{e}m chamada (ou antes ou ap@'{o}s @code{trace_options}). 

@code{trace_options (@var{f})} reposiciona todas as op@value{cedilha}@~{o}es para seus valores padr@~{a}o.

As op@value{cedilha}@~{o}es de palavra chave s@~{a}o:

@itemize @bullet
@item
@code{noprint}
N@~{a}o mostre uma mensagem na entrada da fun@value{cedilha}@~{a}o e saia.
@item
@code{break}
Coloque um ponto de parada antes da fun@value{cedilha}@~{a}o ser inserida,
e ap@'{o}s a fun@value{cedilha}@~{a}os er retirada. Veja @code{break}.
@item
@code{lisp_print}
Mostre argumentos e valores de retorno com objetos Lisp.
@item
@code{info}
Mostre @code{-> true} na entrada da fun@value{cedilha}@`ao e saia.
@item
@code{errorcatch}
Capture os erros, fornecendo a op@value{cedilha}@~{a}o para sinalizar um erro,
tentar novamente a chamada de fun@value{cedilha}@~{a}o, ou especificar um valor de retorno.
@end itemize

Op@value{cedilha}@~{o}es para @code{trace} s@~{a}o especificadas em duas formas. A presen@value{cedilha}a da palavra chave de 
op@value{cedilha}@~{a}o sozinha coloca a op@value{cedilha}@~{a}o para ter efeito incondicionalmente.
(Note que op@value{cedilha}@~{a}o @var{foo} n@~{a}o coloca para ter efeito especificando 
@code{@var{foo}: true} ou uma forma similar; note tamb@'{e}m que palavras chave n@~{a}o precisam
estar com ap@'{o}strofo.) Especificando a op@value{cedilha}@~{a}o palavra chave com uma fun@value{cedilha}@~{a}o
predicado torna a op@value{cedilha}@~{a}o condicional sobre o predicado.

A lista de argumentos para a fun@value{cedilha}@~{a}o predicado @'{e} sempre 
@code{[level, direction, function, item]} onde @code{level} @'{e} o n@'{i}vel rerecurs@~{a}o
para a fun@value{cedilha}@~{a}o,  @code{direction} @'{e} ou @code{enter} ou @code{exit}, @code{function} @'{e} o
nome da fun@value{cedilha}@~{a}o, e @code{item} @'{e} a lista de argumentos (sobre entrada)
ou o valor de retorno (sobre a sa@'{i}da).

Aqui est@'{a} um exemplo de op@value{cedilha}@~{o}es incondicionais de @code{trace}:

@example
(%i1) ff(n) := if equal(n, 0) then 1 else n * ff(n - 1)$

(%i2) trace (ff)$

(%i3) trace_options (ff, lisp_print, break)$

(%i4) ff(3);
@end example

Aqui est@'{a} a mesma fun@value{cedilha}@~{a}o, com a op@value{cedilha}@~{a}o @code{break} condicional
sobre um predicado:

@example
(%i5) trace_options (ff, break(pp))$

(%i6) pp (level, direction, function, item) := block (print (item),
    return (function = 'ff and level = 3 and direction = exit))$

(%i7) ff(6);
@end example

@end deffn

@deffn {Fun@value{cedilha}@~{a}o} untrace (@var{f_1}, ..., @var{f_n})
@deffnx {Fun@value{cedilha}@~{a}o} untrace ()
Dadas as fun@value{cedilha}@~{o}es @var{f_1}, ..., @var{f_n},
@code{untrace} desabilita a a monitora@value{cedilha}@~{a}o habilitada pela fun@value{cedilha}@~{a}o @code{trace}.
Sem argumentos, @code{untrace} desabilita a atua@value{cedilha}@~{a}o da fun@value{cedilha}@~{a}o @code{trade} para todas as fun@value{cedilha}@~{o}es.

@code{untrace} retorne uma lista das fun@value{cedilha}@~{o}es para as quais 
@code{untrace} desabilita a atua@value{cedilha}@~{a}o de @code{trace}.

@end deffn
