annotate lisp/emacs-lisp/trace.el @ 55434:f88632e54afb

2004-05-08 John Wiegley <johnw@newartisans.com> * iswitchb.el (iswitchb-use-virtual-buffers): Added support for "virtual buffers" (off by default), which makes it possible to switch to the buffers of recently files. When a buffer name search fails, and this option is on, iswitchb will look at the list of recently visited files, and permit matching against those names. When the user hits RET on a match, it will revisit that file. (iswitchb-read-buffer): Added two optional arguments, which makes isearchb.el possible. (iswitchb-completions, iswitchb-set-matches, iswitchb-prev-match, iswitchb-next-match): Added support for virtual buffers.
author John Wiegley <johnw@newartisans.com>
date Sat, 08 May 2004 13:00:52 +0000
parents 695cf19ef79e
children eeb966123ab7 375f2633d815
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2854
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1 ;;; trace.el --- tracing facility for Emacs Lisp functions
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3 ;; Copyright (C) 1993 Free Software Foundation, Inc.
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
4
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
5 ;; Author: Hans Chalupsky <hans@cs.buffalo.edu>
28574
23e11bfcfc21 Change maintainer. Use new backquote
Dave Love <fx@gnu.org>
parents: 21365
diff changeset
6 ;; Maintainer: FSF
2854
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7 ;; Created: 15 Dec 1992
5140
9cde7d7fea1f Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 2854
diff changeset
8 ;; Keywords: tools, lisp
2854
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
10 ;; This file is part of GNU Emacs.
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
11
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
12 ;; GNU Emacs is free software; you can redistribute it and/or modify
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
13 ;; it under the terms of the GNU General Public License as published by
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
14 ;; the Free Software Foundation; either version 2, or (at your option)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
15 ;; any later version.
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
16
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
17 ;; GNU Emacs is distributed in the hope that it will be useful,
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
18 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
20 ;; GNU General Public License for more details.
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
21
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
22 ;; You should have received a copy of the GNU General Public License
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 11694
diff changeset
23 ;; along with GNU Emacs; see the file COPYING. If not, write to the
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 11694
diff changeset
24 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 11694
diff changeset
25 ;; Boston, MA 02111-1307, USA.
2854
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
26
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
27 ;; LCD Archive Entry:
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
28 ;; trace|Hans Chalupsky|hans@cs.buffalo.edu|
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
29 ;; Tracing facility for Emacs Lisp functions|
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
30 ;; 1993/05/18 00:41:16|2.0|~/packages/trace.el.Z|
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
31
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
32
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
33 ;;; Commentary:
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
34
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
35 ;; Introduction:
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
36 ;; =============
47609
9c74f4f1d1c0 Add/remove spaces.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28574
diff changeset
37 ;; A simple trace package that utilizes advice.el. It generates trace
2854
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
38 ;; information in a Lisp-style fashion and inserts it into a trace output
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
39 ;; buffer. Tracing can be done in the background (or silently) so that
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
40 ;; generation of trace output won't interfere with what you are currently
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
41 ;; doing.
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
42
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
43 ;; Requirement:
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
44 ;; ============
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
45 ;; trace.el needs advice.el version 2.0 or later which you can get from the
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
46 ;; same place from where you got trace.el.
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
47
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
48 ;; Restrictions:
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
49 ;; =============
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
50 ;; - Traced subrs when called interactively will always show nil as the
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
51 ;; value of their arguments.
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
52 ;; - Only functions/macros/subrs that are called via their function cell will
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
53 ;; generate trace output, hence, you won't get trace output for:
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
54 ;; + Subrs called directly from other subrs/C-code
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
55 ;; + Compiled calls to subrs that have special byte-codes associated
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
56 ;; with them (e.g., car, cdr, ...)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
57 ;; + Macros that were expanded during compilation
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
58 ;; - All the restrictions that apply to advice.el
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
59
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
60 ;; Installation:
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
61 ;; =============
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
62 ;; Put this file together with advice.el (version 2.0 or later) somewhere
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
63 ;; into your Emacs `load-path', byte-compile it/them for efficiency, and
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
64 ;; put the following autoload declarations into your .emacs
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
65 ;;
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
66 ;; (autoload 'trace-function "trace" "Trace a function" t)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
67 ;; (autoload 'trace-function-background "trace" "Trace a function" t)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
68 ;;
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
69 ;; or explicitly load it with (require 'trace) or (load "trace").
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
70
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
71 ;; Usage:
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
72 ;; ======
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
73 ;; - To trace a function say `M-x trace-function' which will ask you for the
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
74 ;; name of the function/subr/macro to trace, as well as for the buffer
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
75 ;; into which trace output should go.
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
76 ;; - If you want to trace a function that switches buffers or does other
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
77 ;; display oriented stuff use `M-x trace-function-background' which will
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
78 ;; generate the trace output silently in the background without popping
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
79 ;; up windows and doing other irritating stuff.
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
80 ;; - To untrace a function say `M-x untrace-function'.
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
81 ;; - To untrace all currently traced functions say `M-x untrace-all'.
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
82
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
83 ;; Examples:
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
84 ;; =========
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
85 ;;
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
86 ;; (defun fact (n)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
87 ;; (if (= n 0) 1
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
88 ;; (* n (fact (1- n)))))
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
89 ;; fact
47609
9c74f4f1d1c0 Add/remove spaces.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28574
diff changeset
90 ;;
2854
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
91 ;; (trace-function 'fact)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
92 ;; fact
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
93 ;;
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
94 ;; Now, evaluating this...
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
95 ;;
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
96 ;; (fact 4)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
97 ;; 24
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
98 ;;
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
99 ;; ...will generate the following in *trace-buffer*:
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
100 ;;
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
101 ;; 1 -> fact: n=4
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
102 ;; | 2 -> fact: n=3
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
103 ;; | | 3 -> fact: n=2
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
104 ;; | | | 4 -> fact: n=1
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
105 ;; | | | | 5 -> fact: n=0
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
106 ;; | | | | 5 <- fact: 1
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
107 ;; | | | 4 <- fact: 1
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
108 ;; | | 3 <- fact: 2
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
109 ;; | 2 <- fact: 6
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
110 ;; 1 <- fact: 24
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
111 ;;
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
112 ;;
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
113 ;; (defun ack (x y z)
47609
9c74f4f1d1c0 Add/remove spaces.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28574
diff changeset
114 ;; (if (= x 0)
2854
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
115 ;; (+ y z)
47609
9c74f4f1d1c0 Add/remove spaces.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28574
diff changeset
116 ;; (if (and (<= x 2) (= z 0))
2854
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
117 ;; (1- x)
47609
9c74f4f1d1c0 Add/remove spaces.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28574
diff changeset
118 ;; (if (and (> x 2) (= z 0))
2854
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
119 ;; y
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
120 ;; (ack (1- x) y (ack x y (1- z)))))))
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
121 ;; ack
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
122 ;;
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
123 ;; (trace-function 'ack)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
124 ;; ack
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
125 ;;
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
126 ;; Try this for some interesting trace output:
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
127 ;;
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
128 ;; (ack 3 3 1)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
129 ;; 27
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
130 ;;
47609
9c74f4f1d1c0 Add/remove spaces.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28574
diff changeset
131 ;;
2854
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
132 ;; The following does something similar to the functionality of the package
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
133 ;; log-message.el by Robert Potter, which is giving you a chance to look at
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
134 ;; messages that might have whizzed by too quickly (you won't see subr
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
135 ;; generated messages though):
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
136 ;;
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
137 ;; (trace-function-background 'message "*Message Log*")
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
138
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
139
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
140 ;;; Change Log:
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
141
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
142 ;; Revision 2.0 1993/05/18 00:41:16 hans
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
143 ;; * Adapted for advice.el 2.0; it now also works
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
144 ;; for GNU Emacs-19 and Lemacs
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
145 ;; * Separate function `trace-function-background'
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
146 ;; * Separate pieces of advice for foreground and background tracing
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
147 ;; * Less insane handling of interactive trace buffer specification
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
148 ;; * String arguments and values are now printed properly
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
149 ;;
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
150 ;; Revision 1.1 1992/12/15 22:45:15 hans
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
151 ;; * Created, first public release
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
152
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
153
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
154 ;;; Code:
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
155
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
156 (require 'advice)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
157
21365
db005054f15d Customized.
Stephen Eglen <stephen@gnu.org>
parents: 14169
diff changeset
158 (defgroup trace nil
db005054f15d Customized.
Stephen Eglen <stephen@gnu.org>
parents: 14169
diff changeset
159 "Tracing facility for Emacs Lisp functions"
db005054f15d Customized.
Stephen Eglen <stephen@gnu.org>
parents: 14169
diff changeset
160 :prefix "trace-"
db005054f15d Customized.
Stephen Eglen <stephen@gnu.org>
parents: 14169
diff changeset
161 :group 'lisp)
db005054f15d Customized.
Stephen Eglen <stephen@gnu.org>
parents: 14169
diff changeset
162
2854
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
163 ;;;###autoload
21365
db005054f15d Customized.
Stephen Eglen <stephen@gnu.org>
parents: 14169
diff changeset
164 (defcustom trace-buffer "*trace-output*"
db005054f15d Customized.
Stephen Eglen <stephen@gnu.org>
parents: 14169
diff changeset
165 "*Trace output will by default go to that buffer."
db005054f15d Customized.
Stephen Eglen <stephen@gnu.org>
parents: 14169
diff changeset
166 :type 'string
db005054f15d Customized.
Stephen Eglen <stephen@gnu.org>
parents: 14169
diff changeset
167 :group 'trace)
2854
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
168
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
169 ;; Current level of traced function invocation:
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
170 (defvar trace-level 0)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
171
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
172 ;; Semi-cryptic name used for a piece of trace advice:
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
173 (defvar trace-advice-name 'trace-function\ )
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
174
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
175 ;; Used to separate new trace output from previous traced runs:
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
176 (defvar trace-separator (format "%s\n" (make-string 70 ?=)))
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
177
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
178 (defun trace-entry-message (function level argument-bindings)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
179 ;; Generates a string that describes that FUNCTION has been entered at
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
180 ;; trace LEVEL with ARGUMENT-BINDINGS.
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
181 (format "%s%s%d -> %s: %s\n"
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
182 (mapconcat 'char-to-string (make-string (1- level) ?|) " ")
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
183 (if (> level 1) " " "")
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
184 level
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
185 function
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
186 (mapconcat (function
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
187 (lambda (binding)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
188 (concat
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
189 (symbol-name (ad-arg-binding-field binding 'name))
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
190 "="
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
191 ;; do this so we'll see strings:
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
192 (prin1-to-string
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
193 (ad-arg-binding-field binding 'value)))))
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
194 argument-bindings
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
195 " ")))
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
196
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
197 (defun trace-exit-message (function level value)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
198 ;; Generates a string that describes that FUNCTION has been exited at
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
199 ;; trace LEVEL and that it returned VALUE.
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
200 (format "%s%s%d <- %s: %s\n"
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
201 (mapconcat 'char-to-string (make-string (1- level) ?|) " ")
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
202 (if (> level 1) " " "")
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
203 level
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
204 function
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
205 ;; do this so we'll see strings:
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
206 (prin1-to-string value)))
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
207
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
208 (defun trace-make-advice (function buffer background)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
209 ;; Builds the piece of advice to be added to FUNCTION's advice info
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
210 ;; so that it will generate the proper trace output in BUFFER
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
211 ;; (quietly if BACKGROUND is t).
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
212 (ad-make-advice
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
213 trace-advice-name nil t
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
214 (cond (background
28574
23e11bfcfc21 Change maintainer. Use new backquote
Dave Love <fx@gnu.org>
parents: 21365
diff changeset
215 `(advice
23e11bfcfc21 Change maintainer. Use new backquote
Dave Love <fx@gnu.org>
parents: 21365
diff changeset
216 lambda ()
23e11bfcfc21 Change maintainer. Use new backquote
Dave Love <fx@gnu.org>
parents: 21365
diff changeset
217 (let ((trace-level (1+ trace-level))
23e11bfcfc21 Change maintainer. Use new backquote
Dave Love <fx@gnu.org>
parents: 21365
diff changeset
218 (trace-buffer (get-buffer-create ,buffer)))
23e11bfcfc21 Change maintainer. Use new backquote
Dave Love <fx@gnu.org>
parents: 21365
diff changeset
219 (save-excursion
23e11bfcfc21 Change maintainer. Use new backquote
Dave Love <fx@gnu.org>
parents: 21365
diff changeset
220 (set-buffer trace-buffer)
23e11bfcfc21 Change maintainer. Use new backquote
Dave Love <fx@gnu.org>
parents: 21365
diff changeset
221 (goto-char (point-max))
23e11bfcfc21 Change maintainer. Use new backquote
Dave Love <fx@gnu.org>
parents: 21365
diff changeset
222 ;; Insert a separator from previous trace output:
23e11bfcfc21 Change maintainer. Use new backquote
Dave Love <fx@gnu.org>
parents: 21365
diff changeset
223 (if (= trace-level 1) (insert trace-separator))
23e11bfcfc21 Change maintainer. Use new backquote
Dave Love <fx@gnu.org>
parents: 21365
diff changeset
224 (insert
23e11bfcfc21 Change maintainer. Use new backquote
Dave Love <fx@gnu.org>
parents: 21365
diff changeset
225 (trace-entry-message
23e11bfcfc21 Change maintainer. Use new backquote
Dave Love <fx@gnu.org>
parents: 21365
diff changeset
226 ',function trace-level ad-arg-bindings)))
23e11bfcfc21 Change maintainer. Use new backquote
Dave Love <fx@gnu.org>
parents: 21365
diff changeset
227 ad-do-it
23e11bfcfc21 Change maintainer. Use new backquote
Dave Love <fx@gnu.org>
parents: 21365
diff changeset
228 (save-excursion
23e11bfcfc21 Change maintainer. Use new backquote
Dave Love <fx@gnu.org>
parents: 21365
diff changeset
229 (set-buffer trace-buffer)
23e11bfcfc21 Change maintainer. Use new backquote
Dave Love <fx@gnu.org>
parents: 21365
diff changeset
230 (goto-char (point-max))
23e11bfcfc21 Change maintainer. Use new backquote
Dave Love <fx@gnu.org>
parents: 21365
diff changeset
231 (insert
23e11bfcfc21 Change maintainer. Use new backquote
Dave Love <fx@gnu.org>
parents: 21365
diff changeset
232 (trace-exit-message
23e11bfcfc21 Change maintainer. Use new backquote
Dave Love <fx@gnu.org>
parents: 21365
diff changeset
233 ',function trace-level ad-return-value))))))
23e11bfcfc21 Change maintainer. Use new backquote
Dave Love <fx@gnu.org>
parents: 21365
diff changeset
234 (t `(advice
23e11bfcfc21 Change maintainer. Use new backquote
Dave Love <fx@gnu.org>
parents: 21365
diff changeset
235 lambda ()
23e11bfcfc21 Change maintainer. Use new backquote
Dave Love <fx@gnu.org>
parents: 21365
diff changeset
236 (let ((trace-level (1+ trace-level))
23e11bfcfc21 Change maintainer. Use new backquote
Dave Love <fx@gnu.org>
parents: 21365
diff changeset
237 (trace-buffer (get-buffer-create ,buffer)))
23e11bfcfc21 Change maintainer. Use new backquote
Dave Love <fx@gnu.org>
parents: 21365
diff changeset
238 (pop-to-buffer trace-buffer)
23e11bfcfc21 Change maintainer. Use new backquote
Dave Love <fx@gnu.org>
parents: 21365
diff changeset
239 (goto-char (point-max))
23e11bfcfc21 Change maintainer. Use new backquote
Dave Love <fx@gnu.org>
parents: 21365
diff changeset
240 ;; Insert a separator from previous trace output:
23e11bfcfc21 Change maintainer. Use new backquote
Dave Love <fx@gnu.org>
parents: 21365
diff changeset
241 (if (= trace-level 1) (insert trace-separator))
23e11bfcfc21 Change maintainer. Use new backquote
Dave Love <fx@gnu.org>
parents: 21365
diff changeset
242 (insert
23e11bfcfc21 Change maintainer. Use new backquote
Dave Love <fx@gnu.org>
parents: 21365
diff changeset
243 (trace-entry-message
23e11bfcfc21 Change maintainer. Use new backquote
Dave Love <fx@gnu.org>
parents: 21365
diff changeset
244 ',function trace-level ad-arg-bindings))
23e11bfcfc21 Change maintainer. Use new backquote
Dave Love <fx@gnu.org>
parents: 21365
diff changeset
245 ad-do-it
23e11bfcfc21 Change maintainer. Use new backquote
Dave Love <fx@gnu.org>
parents: 21365
diff changeset
246 (pop-to-buffer trace-buffer)
23e11bfcfc21 Change maintainer. Use new backquote
Dave Love <fx@gnu.org>
parents: 21365
diff changeset
247 (goto-char (point-max))
23e11bfcfc21 Change maintainer. Use new backquote
Dave Love <fx@gnu.org>
parents: 21365
diff changeset
248 (insert
23e11bfcfc21 Change maintainer. Use new backquote
Dave Love <fx@gnu.org>
parents: 21365
diff changeset
249 (trace-exit-message
23e11bfcfc21 Change maintainer. Use new backquote
Dave Love <fx@gnu.org>
parents: 21365
diff changeset
250 ',function trace-level ad-return-value))))))))
2854
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
251
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
252 (defun trace-function-internal (function buffer background)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
253 ;; Adds trace advice for FUNCTION and activates it.
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
254 (ad-add-advice
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
255 function
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
256 (trace-make-advice function (or buffer trace-buffer) background)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
257 'around 'last)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
258 (ad-activate function nil))
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
259
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
260 (defun trace-is-traced (function)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
261 (ad-find-advice function 'around trace-advice-name))
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
262
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
263 ;;;###autoload
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
264 (defun trace-function (function &optional buffer)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
265 "Traces FUNCTION with trace output going to BUFFER.
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
266 For every call of FUNCTION Lisp-style trace messages that display argument
47609
9c74f4f1d1c0 Add/remove spaces.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28574
diff changeset
267 and return values will be inserted into BUFFER. This function generates the
2854
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
268 trace advice for FUNCTION and activates it together with any other advice
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
269 there might be!! The trace BUFFER will popup whenever FUNCTION is called.
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
270 Do not use this to trace functions that switch buffers or do any other
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
271 display oriented stuff, use `trace-function-background' instead."
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
272 (interactive
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
273 (list
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
274 (intern (completing-read "Trace function: " obarray 'fboundp t))
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
275 (read-buffer "Output to buffer: " trace-buffer)))
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
276 (trace-function-internal function buffer nil))
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
277
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
278 ;;;###autoload
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
279 (defun trace-function-background (function &optional buffer)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
280 "Traces FUNCTION with trace output going quietly to BUFFER.
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
281 For every call of FUNCTION Lisp-style trace messages that display argument
47609
9c74f4f1d1c0 Add/remove spaces.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28574
diff changeset
282 and return values will be inserted into BUFFER. This function generates the
2854
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
283 trace advice for FUNCTION and activates it together with any other advice
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
284 there might be!! Trace output will quietly go to BUFFER without changing
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
285 the window or buffer configuration at all."
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
286 (interactive
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
287 (list
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
288 (intern
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
289 (completing-read "Trace function in background: " obarray 'fboundp t))
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
290 (read-buffer "Output to buffer: " trace-buffer)))
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
291 (trace-function-internal function buffer t))
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
292
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
293 (defun untrace-function (function)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
294 "Untraces FUNCTION and possibly activates all remaining advice.
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
295 Activation is performed with `ad-update', hence remaining advice will get
47609
9c74f4f1d1c0 Add/remove spaces.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28574
diff changeset
296 activated only if the advice of FUNCTION is currently active. If FUNCTION
2854
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
297 was not traced this is a noop."
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
298 (interactive
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
299 (list (ad-read-advised-function "Untrace function: " 'trace-is-traced)))
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
300 (cond ((trace-is-traced function)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
301 (ad-remove-advice function 'around trace-advice-name)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
302 (ad-update function))))
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
303
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
304 (defun untrace-all ()
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
305 "Untraces all currently traced functions."
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
306 (interactive)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
307 (ad-do-advised-functions (function)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
308 (untrace-function function)))
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
309
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
310 (provide 'trace)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
311
52401
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 47609
diff changeset
312 ;;; arch-tag: cfd170a7-4932-4331-8c8b-b7151942e5a1
2854
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
313 ;;; trace.el ends here