Homepage: https://www.gnu.org/software/emacs
Author: Hans Chalupsky
Tracing facility for Emacs Lisp functions
Introduction:
=============
A simple trace package that utilizes nadvice.el. It generates trace
information in a Lisp-style fashion and inserts it into a trace output
buffer. Tracing can be done in the background (or silently) so that
generation of trace output won't interfere with what you are currently
doing.
Restrictions:
=============
- Traced subrs when called interactively will always show nil as the
value of their arguments.
- Only functions/macros/subrs that are called via their function cell will
generate trace output, hence, you won't get trace output for:
+ Subrs called directly from other subrs/C-code
+ Compiled calls to subrs that have special byte-codes associated
with them (e.g., car, cdr, ...)
+ Macros that were expanded during compilation
- All the restrictions that apply to nadvice.el
Usage:
======
- To trace a function say `M-x trace-function', which will ask you for the
name of the function/subr/macro to trace.
- If you want to trace a function that switches buffers or does other
display oriented stuff use `M-x trace-function-background', which will
generate the trace output silently in the background without popping
up windows and doing other irritating stuff.
- To untrace a function say `M-x untrace-function'.
- To untrace all currently traced functions say `M-x untrace-all'.
Examples:
=========
(defun fact (n)
(if (= n 0) 1
(* n (fact (1- n)))))
fact
(trace-function 'fact)
fact
Now, evaluating this...
(fact 4)
24
...will generate the following in *trace-buffer*:
1 -> fact: n=4
| 2 -> fact: n=3
| | 3 -> fact: n=2
| | | 4 -> fact: n=1
| | | | 5 -> fact: n=0
| | | | 5 <- fact: 1
| | | 4 <- fact: 1
| | 3 <- fact: 2
| 2 <- fact: 6
1 <- fact: 24
(defun ack (x y z)
(if (= x 0)
(+ y z)
(if (and (<= x 2) (= z 0))
(1- x)
(if (and (> x 2) (= z 0))
y
(ack (1- x) y (ack x y (1- z)))))))
ack
(trace-function 'ack)
ack
Try this for some interesting trace output:
(ack 3 3 1)
27
The following does something similar to the functionality of the package
log-message.el by Robert Potter, which is giving you a chance to look at
messages that might have whizzed by too quickly (you won't see subr
generated messages though):
(trace-function-background 'message "*Message Log*")