segunda-feira, 11 de agosto de 2008

Configurando o tamanho do stack trace

Chicken dispõe de uma opção para configurar o tamanho do relatório de chamadas de procedimentos (stack trace) a ser exibido em caso de erro. Se a configuração for omitida, o valor 8 é usado, o que significa que serão exibidas as últimas 8 chamadas de procedimento.

Para algumas aplicações, esse número pode ser muito pequeno, mas pode ser aumentado com o parâmetro -:aNUMBER, onde NUMBER é o número de chamadas a ser mostrado (http://chicken.wiki.br/Using%20the%20compiler#runtime-options).

Abaixo está um exemplo de uma situação onde o aumento do stack trace pode ser útil:

(define (l) (error 'oops))
(define (k) (l))
(define (j) (k))
(define (i) (j))
(define (h) (i))
(define (g) (h))
(define (f) (g))
(define (e) (f))
(define (d) (e))
(define (c) (d))
(define (b) (c))
(define (a) (b))

(a)

Executando este código com o interpretador, temos:


$ csi -s oops.scm
Error: oops

Call history:

[e] (f)
[f] (g)
[g] (h)
[h] (i)
[i] (j)
[j] (k)
[k] (l)
[l] (error (quote oops)) <--

Com esse relatório, não fica claro que quem originou a chamada de l foi a. Mas, se aumentarmos o tamanho do relatório:


$ csi -:a14 -s oops.scm
Error: oops

Call history:

(a)
(a)
[a] (b)
[b] (c)
[c] (d)
[d] (e)
[e] (f)
[f] (g)
[g] (h)
[h] (i)
[i] (j)
[j] (k)
[k] (l)
[l] (error (quote oops)) <--

O parâmetro -:aNUMBER também é válido para programas compilados com o compilador de Chicken (csc):


$ csc oops.scm
$ ./oops
Error: oops

Call history:

oops.scm: 8 f
oops.scm: 7 g
oops.scm: 6 h
oops.scm: 5 i
oops.scm: 4 j
oops.scm: 3 k
oops.scm: 2 l
oops.scm: 1 error <--

$ ./oops -:a14
Error: oops

Call history:

oops.scm: 14 a
oops.scm: 12 b
oops.scm: 11 c
oops.scm: 10 d
oops.scm: 9 e
oops.scm: 8 f
oops.scm: 7 g
oops.scm: 6 h
oops.scm: 5 i
oops.scm: 4 j
oops.scm: 3 k
oops.scm: 2 l
oops.scm: 1 error <--

Um comentário:

Alonso disse...

Mario, bom saber disso.

Uma coisa útil seria deixar claro no relatório que o stack trace foi cortado devido a ter chegado no limite de seu tamanho, embora parece que o relatório completo repete a chamada raiz no topo (ao menos no seu exemplo), então nesse caso é possível saber quando o relatório é completo ou não.