annotate lisp/emacs-lisp/trace.el @ 72863:526dc1f36b09

(produce_image_glyph): Automatically crop wide images at right window edge so we can draw the cursor on the same row to avoid confusing redisplay by placing the cursor outside the visible window area.
author Kim F. Storm <storm@cua.dk>
date Thu, 14 Sep 2006 09:37:44 +0000
parents 6ad55ad9813c
children 1d4b1a32fd66 c358d0861b16
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
64751
5b1a238fcbb4 Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 64085
diff changeset
3 ;; Copyright (C) 1993, 1998, 2000, 2002, 2003, 2004,
68648
067115a6e738 Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 64751
diff changeset
4 ;; 2005, 2006 Free Software Foundation, Inc.
2854
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
5
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
6 ;; Author: Hans Chalupsky <hans@cs.buffalo.edu>
28574
23e11bfcfc21 Change maintainer. Use new backquote
Dave Love <fx@gnu.org>
parents: 21365
diff changeset
7 ;; Maintainer: FSF
2854
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8 ;; Created: 15 Dec 1992
5140
9cde7d7fea1f Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 2854
diff changeset
9 ;; Keywords: tools, lisp
2854
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
10
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
11 ;; This file is part of GNU Emacs.
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
12
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
13 ;; 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
14 ;; 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
15 ;; the Free Software Foundation; either version 2, or (at your option)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
16 ;; any later version.
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
17
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
18 ;; 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
19 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
20 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
21 ;; GNU General Public License for more details.
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
22
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
23 ;; 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
24 ;; along with GNU Emacs; see the file COPYING. If not, write to the
64085
18a818a2ee7c Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 64032
diff changeset
25 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18a818a2ee7c Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 64032
diff changeset
26 ;; Boston, MA 02110-1301, USA.
2854
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
27
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
28 ;; LCD Archive Entry:
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
29 ;; trace|Hans Chalupsky|hans@cs.buffalo.edu|
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
30 ;; Tracing facility for Emacs Lisp functions|
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
31 ;; 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
32
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
33
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
34 ;;; Commentary:
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
35
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
36 ;; Introduction:
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
37 ;; =============
47609
9c74f4f1d1c0 Add/remove spaces.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28574
diff changeset
38 ;; 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
39 ;; 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
40 ;; 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
41 ;; 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
42 ;; doing.
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
43
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
44 ;; Requirement:
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
45 ;; ============
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
46 ;; 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
47 ;; same place from where you got trace.el.
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
48
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
49 ;; Restrictions:
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
50 ;; =============
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
51 ;; - Traced subrs when called interactively will always show nil as the
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
52 ;; value of their arguments.
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
53 ;; - 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
54 ;; generate trace output, hence, you won't get trace output for:
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
55 ;; + Subrs called directly from other subrs/C-code
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
56 ;; + Compiled calls to subrs that have special byte-codes associated
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
57 ;; with them (e.g., car, cdr, ...)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
58 ;; + Macros that were expanded during compilation
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
59 ;; - All the restrictions that apply to advice.el
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
60
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
61 ;; Installation:
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
62 ;; =============
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
63 ;; 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
64 ;; 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
65 ;; put the following autoload declarations into your .emacs
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
66 ;;
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
67 ;; (autoload 'trace-function "trace" "Trace a function" t)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
68 ;; (autoload 'trace-function-background "trace" "Trace a function" t)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
69 ;;
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
70 ;; or explicitly load it with (require 'trace) or (load "trace").
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
71
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
72 ;; Usage:
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
73 ;; ======
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
74 ;; - 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
75 ;; 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
76 ;; into which trace output should go.
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
77 ;; - 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
78 ;; display oriented stuff use `M-x trace-function-background' which will
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
79 ;; generate the trace output silently in the background without popping
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
80 ;; up windows and doing other irritating stuff.
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
81 ;; - To untrace a function say `M-x untrace-function'.
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
82 ;; - To untrace all currently traced functions say `M-x untrace-all'.
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
83
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
84 ;; Examples:
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 ;;
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
87 ;; (defun fact (n)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
88 ;; (if (= n 0) 1
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
89 ;; (* n (fact (1- n)))))
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
90 ;; fact
47609
9c74f4f1d1c0 Add/remove spaces.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28574
diff changeset
91 ;;
2854
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
92 ;; (trace-function 'fact)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
93 ;; fact
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
94 ;;
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
95 ;; Now, evaluating this...
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
96 ;;
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
97 ;; (fact 4)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
98 ;; 24
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
99 ;;
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
100 ;; ...will generate the following in *trace-buffer*:
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
101 ;;
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
102 ;; 1 -> fact: n=4
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
103 ;; | 2 -> fact: n=3
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
104 ;; | | 3 -> fact: n=2
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
105 ;; | | | 4 -> fact: n=1
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
106 ;; | | | | 5 -> fact: n=0
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
107 ;; | | | | 5 <- fact: 1
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
108 ;; | | | 4 <- fact: 1
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
109 ;; | | 3 <- fact: 2
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
110 ;; | 2 <- fact: 6
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
111 ;; 1 <- fact: 24
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 ;;
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
114 ;; (defun ack (x y z)
47609
9c74f4f1d1c0 Add/remove spaces.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28574
diff changeset
115 ;; (if (= x 0)
2854
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
116 ;; (+ y z)
47609
9c74f4f1d1c0 Add/remove spaces.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28574
diff changeset
117 ;; (if (and (<= x 2) (= z 0))
2854
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
118 ;; (1- x)
47609
9c74f4f1d1c0 Add/remove spaces.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28574
diff changeset
119 ;; (if (and (> x 2) (= z 0))
2854
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
120 ;; y
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
121 ;; (ack (1- x) y (ack x y (1- z)))))))
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
122 ;; ack
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
123 ;;
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
124 ;; (trace-function 'ack)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
125 ;; ack
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
126 ;;
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
127 ;; Try this for some interesting trace output:
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
128 ;;
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
129 ;; (ack 3 3 1)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
130 ;; 27
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
131 ;;
47609
9c74f4f1d1c0 Add/remove spaces.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28574
diff changeset
132 ;;
2854
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
133 ;; The following does something similar to the functionality of the package
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
134 ;; 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
135 ;; 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
136 ;; generated messages though):
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
137 ;;
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
138 ;; (trace-function-background 'message "*Message Log*")
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
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
141 ;;; Change Log:
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
142
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
143 ;; Revision 2.0 1993/05/18 00:41:16 hans
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
144 ;; * Adapted for advice.el 2.0; it now also works
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
145 ;; for GNU Emacs-19 and Lemacs
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
146 ;; * Separate function `trace-function-background'
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
147 ;; * Separate pieces of advice for foreground and background tracing
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
148 ;; * Less insane handling of interactive trace buffer specification
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
149 ;; * String arguments and values are now printed properly
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
150 ;;
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
151 ;; Revision 1.1 1992/12/15 22:45:15 hans
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
152 ;; * Created, first public release
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
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
155 ;;; Code:
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
156
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
157 (require 'advice)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
158
21365
db005054f15d Customized.
Stephen Eglen <stephen@gnu.org>
parents: 14169
diff changeset
159 (defgroup trace nil
64032
85b597997ef0 (trace): Finish `defgroup' description with period.
Juanma Barranquero <lekktu@gmail.com>
parents: 60276
diff changeset
160 "Tracing facility for Emacs Lisp functions."
21365
db005054f15d Customized.
Stephen Eglen <stephen@gnu.org>
parents: 14169
diff changeset
161 :prefix "trace-"
db005054f15d Customized.
Stephen Eglen <stephen@gnu.org>
parents: 14169
diff changeset
162 :group 'lisp)
db005054f15d Customized.
Stephen Eglen <stephen@gnu.org>
parents: 14169
diff changeset
163
2854
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
164 ;;;###autoload
21365
db005054f15d Customized.
Stephen Eglen <stephen@gnu.org>
parents: 14169
diff changeset
165 (defcustom trace-buffer "*trace-output*"
db005054f15d Customized.
Stephen Eglen <stephen@gnu.org>
parents: 14169
diff changeset
166 "*Trace output will by default go to that buffer."
db005054f15d Customized.
Stephen Eglen <stephen@gnu.org>
parents: 14169
diff changeset
167 :type 'string
db005054f15d Customized.
Stephen Eglen <stephen@gnu.org>
parents: 14169
diff changeset
168 :group 'trace)
2854
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
169
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
170 ;; Current level of traced function invocation:
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
171 (defvar trace-level 0)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
172
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
173 ;; Semi-cryptic name used for a piece of trace advice:
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
174 (defvar trace-advice-name 'trace-function\ )
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
175
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
176 ;; Used to separate new trace output from previous traced runs:
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
177 (defvar trace-separator (format "%s\n" (make-string 70 ?=)))
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
178
60276
eeb966123ab7 (inhibit-trace): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
179 (defvar inhibit-trace nil
eeb966123ab7 (inhibit-trace): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
180 "If non-nil, all tracing is temporarily inhibited.")
eeb966123ab7 (inhibit-trace): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
181
2854
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
182 (defun trace-entry-message (function level argument-bindings)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
183 ;; Generates a string that describes that FUNCTION has been entered at
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
184 ;; trace LEVEL with ARGUMENT-BINDINGS.
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
185 (format "%s%s%d -> %s: %s\n"
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
186 (mapconcat 'char-to-string (make-string (1- level) ?|) " ")
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
187 (if (> level 1) " " "")
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
188 level
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
189 function
60276
eeb966123ab7 (inhibit-trace): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
190 (mapconcat (lambda (binding)
eeb966123ab7 (inhibit-trace): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
191 (concat
eeb966123ab7 (inhibit-trace): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
192 (symbol-name (ad-arg-binding-field binding 'name))
eeb966123ab7 (inhibit-trace): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
193 "="
eeb966123ab7 (inhibit-trace): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
194 ;; do this so we'll see strings:
eeb966123ab7 (inhibit-trace): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
195 (prin1-to-string
eeb966123ab7 (inhibit-trace): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
196 (ad-arg-binding-field binding 'value))))
2854
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
197 argument-bindings
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
198 " ")))
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
199
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
200 (defun trace-exit-message (function level value)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
201 ;; Generates a string that describes that FUNCTION has been exited at
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
202 ;; trace LEVEL and that it returned VALUE.
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
203 (format "%s%s%d <- %s: %s\n"
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
204 (mapconcat 'char-to-string (make-string (1- level) ?|) " ")
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
205 (if (> level 1) " " "")
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
206 level
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
207 function
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
208 ;; do this so we'll see strings:
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
209 (prin1-to-string value)))
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
210
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
211 (defun trace-make-advice (function buffer background)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
212 ;; 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
213 ;; so that it will generate the proper trace output in BUFFER
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
214 ;; (quietly if BACKGROUND is t).
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
215 (ad-make-advice
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
216 trace-advice-name nil t
60276
eeb966123ab7 (inhibit-trace): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
217 `(advice
eeb966123ab7 (inhibit-trace): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
218 lambda ()
eeb966123ab7 (inhibit-trace): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
219 (let ((trace-level (1+ trace-level))
eeb966123ab7 (inhibit-trace): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
220 (trace-buffer (get-buffer-create ,buffer)))
eeb966123ab7 (inhibit-trace): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
221 (unless inhibit-trace
eeb966123ab7 (inhibit-trace): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
222 (with-current-buffer trace-buffer
eeb966123ab7 (inhibit-trace): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
223 ,(unless background '(pop-to-buffer trace-buffer))
eeb966123ab7 (inhibit-trace): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
224 (goto-char (point-max))
eeb966123ab7 (inhibit-trace): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
225 ;; Insert a separator from previous trace output:
eeb966123ab7 (inhibit-trace): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
226 (if (= trace-level 1) (insert trace-separator))
eeb966123ab7 (inhibit-trace): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
227 (insert
eeb966123ab7 (inhibit-trace): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
228 (trace-entry-message
eeb966123ab7 (inhibit-trace): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
229 ',function trace-level ad-arg-bindings))))
eeb966123ab7 (inhibit-trace): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
230 ad-do-it
eeb966123ab7 (inhibit-trace): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
231 (unless inhibit-trace
eeb966123ab7 (inhibit-trace): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
232 (with-current-buffer trace-buffer
eeb966123ab7 (inhibit-trace): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
233 ,(unless background '(pop-to-buffer trace-buffer))
eeb966123ab7 (inhibit-trace): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
234 (goto-char (point-max))
eeb966123ab7 (inhibit-trace): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
235 (insert
eeb966123ab7 (inhibit-trace): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
236 (trace-exit-message
eeb966123ab7 (inhibit-trace): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
237 ',function trace-level ad-return-value))))))))
2854
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
238
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
239 (defun trace-function-internal (function buffer background)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
240 ;; Adds trace advice for FUNCTION and activates it.
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
241 (ad-add-advice
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
242 function
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
243 (trace-make-advice function (or buffer trace-buffer) background)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
244 'around 'last)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
245 (ad-activate function nil))
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
246
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
247 (defun trace-is-traced (function)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
248 (ad-find-advice function 'around trace-advice-name))
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
249
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
250 ;;;###autoload
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
251 (defun trace-function (function &optional buffer)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
252 "Traces FUNCTION with trace output going to BUFFER.
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
253 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
254 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
255 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
256 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
257 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
258 display oriented stuff, use `trace-function-background' instead."
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
259 (interactive
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
260 (list
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
261 (intern (completing-read "Trace function: " obarray 'fboundp t))
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
262 (read-buffer "Output to buffer: " trace-buffer)))
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
263 (trace-function-internal function buffer nil))
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
264
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
265 ;;;###autoload
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
266 (defun trace-function-background (function &optional buffer)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
267 "Traces FUNCTION with trace output going quietly to BUFFER.
72586
6ad55ad9813c (trace-function-background): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 68648
diff changeset
268 When this tracing is enabled, every call to FUNCTION writes
6ad55ad9813c (trace-function-background): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 68648
diff changeset
269 a Lisp-style trace message (showing the arguments and return value)
6ad55ad9813c (trace-function-background): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 68648
diff changeset
270 into BUFFER. This function generates advice to trace FUNCTION
6ad55ad9813c (trace-function-background): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 68648
diff changeset
271 and activates it together with any other advice there might be.
6ad55ad9813c (trace-function-background): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 68648
diff changeset
272 The trace output goes to BUFFER quietly, without changing
6ad55ad9813c (trace-function-background): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 68648
diff changeset
273 the window or buffer configuration.
6ad55ad9813c (trace-function-background): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 68648
diff changeset
274
6ad55ad9813c (trace-function-background): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 68648
diff changeset
275 BUFFER defaults to `trace-buffer'."
2854
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
276 (interactive
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
277 (list
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
278 (intern
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
279 (completing-read "Trace function in background: " obarray 'fboundp t))
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
280 (read-buffer "Output to buffer: " trace-buffer)))
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
281 (trace-function-internal function buffer t))
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
282
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
283 (defun untrace-function (function)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
284 "Untraces FUNCTION and possibly activates all remaining advice.
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
285 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
286 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
287 was not traced this is a noop."
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
288 (interactive
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
289 (list (ad-read-advised-function "Untrace function: " 'trace-is-traced)))
60276
eeb966123ab7 (inhibit-trace): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
290 (when (trace-is-traced function)
eeb966123ab7 (inhibit-trace): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
291 (ad-remove-advice function 'around trace-advice-name)
eeb966123ab7 (inhibit-trace): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
292 (ad-update function)))
2854
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
293
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
294 (defun untrace-all ()
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
295 "Untraces all currently traced functions."
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
296 (interactive)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
297 (ad-do-advised-functions (function)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
298 (untrace-function function)))
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
299
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
300 (provide 'trace)
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
301
60276
eeb966123ab7 (inhibit-trace): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
302 ;; arch-tag: cfd170a7-4932-4331-8c8b-b7151942e5a1
2854
6ed299f80cbb entered into RCS
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
303 ;;; trace.el ends here