annotate etc/DEBUG @ 27378:af3075bcc264

*** empty log message ***
author Richard M. Stallman <rms@gnu.org>
date Fri, 21 Jan 2000 02:10:26 +0000
parents e96ffe544684
children 4881cd839f12
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
25853
Dave Love <fx@gnu.org>
parents:
diff changeset
1 Debugging GNU Emacs
Dave Love <fx@gnu.org>
parents:
diff changeset
2 Copyright (c) 1985 Richard M. Stallman.
Dave Love <fx@gnu.org>
parents:
diff changeset
3
Dave Love <fx@gnu.org>
parents:
diff changeset
4 Permission is granted to anyone to make or distribute verbatim copies
Dave Love <fx@gnu.org>
parents:
diff changeset
5 of this document as received, in any medium, provided that the
Dave Love <fx@gnu.org>
parents:
diff changeset
6 copyright notice and permission notice are preserved,
Dave Love <fx@gnu.org>
parents:
diff changeset
7 and that the distributor grants the recipient permission
Dave Love <fx@gnu.org>
parents:
diff changeset
8 for further redistribution as permitted by this notice.
Dave Love <fx@gnu.org>
parents:
diff changeset
9
Dave Love <fx@gnu.org>
parents:
diff changeset
10 Permission is granted to distribute modified versions
Dave Love <fx@gnu.org>
parents:
diff changeset
11 of this document, or of portions of it,
Dave Love <fx@gnu.org>
parents:
diff changeset
12 under the above conditions, provided also that they
Dave Love <fx@gnu.org>
parents:
diff changeset
13 carry prominent notices stating who last changed them.
Dave Love <fx@gnu.org>
parents:
diff changeset
14
Dave Love <fx@gnu.org>
parents:
diff changeset
15 On 4.2 you will probably find that dbx does not work for
Dave Love <fx@gnu.org>
parents:
diff changeset
16 debugging GNU Emacs. For one thing, dbx does not keep the
Dave Love <fx@gnu.org>
parents:
diff changeset
17 inferior process's terminal modes separate from its own.
Dave Love <fx@gnu.org>
parents:
diff changeset
18 For another, dbx does not put the inferior in a separate
Dave Love <fx@gnu.org>
parents:
diff changeset
19 process group, which makes trouble when an inferior uses
Dave Love <fx@gnu.org>
parents:
diff changeset
20 interrupt input, which GNU Emacs must do on 4.2.
Dave Love <fx@gnu.org>
parents:
diff changeset
21
Dave Love <fx@gnu.org>
parents:
diff changeset
22 dbx has also been observed to have other problems,
Dave Love <fx@gnu.org>
parents:
diff changeset
23 such as getting incorrect values for register variables
Dave Love <fx@gnu.org>
parents:
diff changeset
24 in stack frames other than the innermost one.
Dave Love <fx@gnu.org>
parents:
diff changeset
25
Dave Love <fx@gnu.org>
parents:
diff changeset
26 The Emacs distribution now contains GDB, the new source-level
Dave Love <fx@gnu.org>
parents:
diff changeset
27 debugger for the GNU system. GDB works for debugging Emacs.
Dave Love <fx@gnu.org>
parents:
diff changeset
28 GDB currently runs on vaxes under 4.2 and on Sun 2 and Sun 3
Dave Love <fx@gnu.org>
parents:
diff changeset
29 systems.
Dave Love <fx@gnu.org>
parents:
diff changeset
30
Dave Love <fx@gnu.org>
parents:
diff changeset
31
Dave Love <fx@gnu.org>
parents:
diff changeset
32 ** Some useful techniques
Dave Love <fx@gnu.org>
parents:
diff changeset
33
Dave Love <fx@gnu.org>
parents:
diff changeset
34 `Fsignal' is a very useful place to stop in.
Dave Love <fx@gnu.org>
parents:
diff changeset
35 All Lisp errors go through there.
Dave Love <fx@gnu.org>
parents:
diff changeset
36
Dave Love <fx@gnu.org>
parents:
diff changeset
37 It is useful, when debugging, to have a guaranteed way
Dave Love <fx@gnu.org>
parents:
diff changeset
38 to return to the debugger at any time. If you are using
Dave Love <fx@gnu.org>
parents:
diff changeset
39 interrupt-driven input, which is the default, then Emacs is using
Dave Love <fx@gnu.org>
parents:
diff changeset
40 RAW mode and the only way you can do it is to store
Dave Love <fx@gnu.org>
parents:
diff changeset
41 the code for some character into the variable stop_character:
Dave Love <fx@gnu.org>
parents:
diff changeset
42
Dave Love <fx@gnu.org>
parents:
diff changeset
43 set stop_character = 29
Dave Love <fx@gnu.org>
parents:
diff changeset
44
Dave Love <fx@gnu.org>
parents:
diff changeset
45 makes Control-] (decimal code 29) the stop character.
Dave Love <fx@gnu.org>
parents:
diff changeset
46 Typing Control-] will cause immediate stop. You cannot
Dave Love <fx@gnu.org>
parents:
diff changeset
47 use the set command until the inferior process has been started.
Dave Love <fx@gnu.org>
parents:
diff changeset
48 Put a breakpoint early in `main', or suspend the Emacs,
Dave Love <fx@gnu.org>
parents:
diff changeset
49 to get an opportunity to do the set command.
Dave Love <fx@gnu.org>
parents:
diff changeset
50
Dave Love <fx@gnu.org>
parents:
diff changeset
51 If you are using cbreak input (see the Lisp function set-input-mode),
Dave Love <fx@gnu.org>
parents:
diff changeset
52 then typing Control-g will cause a SIGINT, which will return control
Dave Love <fx@gnu.org>
parents:
diff changeset
53 to the debugger immediately unless you have done
Dave Love <fx@gnu.org>
parents:
diff changeset
54
Dave Love <fx@gnu.org>
parents:
diff changeset
55 ignore 3 (in dbx)
Dave Love <fx@gnu.org>
parents:
diff changeset
56 or handle 3 nostop noprint (in gdb)
Dave Love <fx@gnu.org>
parents:
diff changeset
57
Dave Love <fx@gnu.org>
parents:
diff changeset
58 You will note that most of GNU Emacs is written to avoid
Dave Love <fx@gnu.org>
parents:
diff changeset
59 declaring a local variable in an inner block, even in
Dave Love <fx@gnu.org>
parents:
diff changeset
60 cases where using one would be the cleanest thing to do.
Dave Love <fx@gnu.org>
parents:
diff changeset
61 This is because dbx cannot access any of the variables
Dave Love <fx@gnu.org>
parents:
diff changeset
62 in a function which has even one variable defined in an
Dave Love <fx@gnu.org>
parents:
diff changeset
63 inner block. A few functions in GNU Emacs do have variables
Dave Love <fx@gnu.org>
parents:
diff changeset
64 in inner blocks, only because I wrote them before realizing
Dave Love <fx@gnu.org>
parents:
diff changeset
65 that dbx had this problem and never rewrote them to avoid it.
Dave Love <fx@gnu.org>
parents:
diff changeset
66
Dave Love <fx@gnu.org>
parents:
diff changeset
67 I believe that GDB does not have such a problem.
Dave Love <fx@gnu.org>
parents:
diff changeset
68
Dave Love <fx@gnu.org>
parents:
diff changeset
69
Dave Love <fx@gnu.org>
parents:
diff changeset
70 ** Examining Lisp object values.
Dave Love <fx@gnu.org>
parents:
diff changeset
71
Dave Love <fx@gnu.org>
parents:
diff changeset
72 When you have a live process to debug, and it has not encountered a
Dave Love <fx@gnu.org>
parents:
diff changeset
73 fatal error, you can use the GDB command `pr'. First print the value
Dave Love <fx@gnu.org>
parents:
diff changeset
74 in the ordinary way, with the `p' command. Then type `pr' with no
Dave Love <fx@gnu.org>
parents:
diff changeset
75 arguments. This calls a subroutine which uses the Lisp printer.
Dave Love <fx@gnu.org>
parents:
diff changeset
76
Dave Love <fx@gnu.org>
parents:
diff changeset
77 If you can't use this command, either because the process can't run
Dave Love <fx@gnu.org>
parents:
diff changeset
78 a subroutine or because the data is invalid, you can fall back on
Dave Love <fx@gnu.org>
parents:
diff changeset
79 lower-level commands.
Dave Love <fx@gnu.org>
parents:
diff changeset
80
Dave Love <fx@gnu.org>
parents:
diff changeset
81 Use the `xtype' command to print out the data type of the last data
Dave Love <fx@gnu.org>
parents:
diff changeset
82 value. Once you know the data type, use the command that corresponds
Dave Love <fx@gnu.org>
parents:
diff changeset
83 to that type. Here are these commands:
Dave Love <fx@gnu.org>
parents:
diff changeset
84
Dave Love <fx@gnu.org>
parents:
diff changeset
85 xint xptr xwindow xmarker xoverlay xmiscfree xintfwd xboolfwd xobjfwd
Dave Love <fx@gnu.org>
parents:
diff changeset
86 xbufobjfwd xkbobjfwd xbuflocal xbuffer xsymbol xstring xvector xframe
Dave Love <fx@gnu.org>
parents:
diff changeset
87 xwinconfig xcompiled xcons xcar xcdr xsubr xprocess xfloat xscrollbar
Dave Love <fx@gnu.org>
parents:
diff changeset
88
Dave Love <fx@gnu.org>
parents:
diff changeset
89 Each one of them applies to a certain type or class of types.
Dave Love <fx@gnu.org>
parents:
diff changeset
90 (Some of these types are not visible in Lisp, because they exist only
Dave Love <fx@gnu.org>
parents:
diff changeset
91 internally.)
Dave Love <fx@gnu.org>
parents:
diff changeset
92
Dave Love <fx@gnu.org>
parents:
diff changeset
93 Each x... command prints some information about the value, and
Dave Love <fx@gnu.org>
parents:
diff changeset
94 produces a GDB value (subsequently available in $) through which you
Dave Love <fx@gnu.org>
parents:
diff changeset
95 can get at the rest of the contents.
Dave Love <fx@gnu.org>
parents:
diff changeset
96
Dave Love <fx@gnu.org>
parents:
diff changeset
97 In general, most of the rest of the contents will be addition Lisp
Dave Love <fx@gnu.org>
parents:
diff changeset
98 objects which you can examine in turn with the x... commands.
Dave Love <fx@gnu.org>
parents:
diff changeset
99
Dave Love <fx@gnu.org>
parents:
diff changeset
100 ** If GDB does not run and your debuggers can't load Emacs.
Dave Love <fx@gnu.org>
parents:
diff changeset
101
Dave Love <fx@gnu.org>
parents:
diff changeset
102 On some systems, no debugger can load Emacs with a symbol table,
Dave Love <fx@gnu.org>
parents:
diff changeset
103 perhaps because they all have fixed limits on the number of symbols
Dave Love <fx@gnu.org>
parents:
diff changeset
104 and Emacs exceeds the limits. Here is a method that can be used
Dave Love <fx@gnu.org>
parents:
diff changeset
105 in such an extremity. Do
Dave Love <fx@gnu.org>
parents:
diff changeset
106
Dave Love <fx@gnu.org>
parents:
diff changeset
107 nm -n temacs > nmout
Dave Love <fx@gnu.org>
parents:
diff changeset
108 strip temacs
Dave Love <fx@gnu.org>
parents:
diff changeset
109 adb temacs
Dave Love <fx@gnu.org>
parents:
diff changeset
110 0xd:i
Dave Love <fx@gnu.org>
parents:
diff changeset
111 0xe:i
Dave Love <fx@gnu.org>
parents:
diff changeset
112 14:i
Dave Love <fx@gnu.org>
parents:
diff changeset
113 17:i
Dave Love <fx@gnu.org>
parents:
diff changeset
114 :r -l loadup (or whatever)
Dave Love <fx@gnu.org>
parents:
diff changeset
115
Dave Love <fx@gnu.org>
parents:
diff changeset
116 It is necessary to refer to the file `nmout' to convert
Dave Love <fx@gnu.org>
parents:
diff changeset
117 numeric addresses into symbols and vice versa.
Dave Love <fx@gnu.org>
parents:
diff changeset
118
Dave Love <fx@gnu.org>
parents:
diff changeset
119 It is useful to be running under a window system.
Dave Love <fx@gnu.org>
parents:
diff changeset
120 Then, if Emacs becomes hopelessly wedged, you can create
Dave Love <fx@gnu.org>
parents:
diff changeset
121 another window to do kill -9 in. kill -ILL is often
Dave Love <fx@gnu.org>
parents:
diff changeset
122 useful too, since that may make Emacs dump core or return
Dave Love <fx@gnu.org>
parents:
diff changeset
123 to adb.
Dave Love <fx@gnu.org>
parents:
diff changeset
124
Dave Love <fx@gnu.org>
parents:
diff changeset
125
Dave Love <fx@gnu.org>
parents:
diff changeset
126 ** Debugging incorrect screen updating.
Dave Love <fx@gnu.org>
parents:
diff changeset
127
Dave Love <fx@gnu.org>
parents:
diff changeset
128 To debug Emacs problems that update the screen wrong, it is useful
Dave Love <fx@gnu.org>
parents:
diff changeset
129 to have a record of what input you typed and what Emacs sent to the
Dave Love <fx@gnu.org>
parents:
diff changeset
130 screen. To make these records, do
Dave Love <fx@gnu.org>
parents:
diff changeset
131
Dave Love <fx@gnu.org>
parents:
diff changeset
132 (open-dribble-file "~/.dribble")
Dave Love <fx@gnu.org>
parents:
diff changeset
133 (open-termscript "~/.termscript")
Dave Love <fx@gnu.org>
parents:
diff changeset
134
Dave Love <fx@gnu.org>
parents:
diff changeset
135 The dribble file contains all characters read by Emacs from the
Dave Love <fx@gnu.org>
parents:
diff changeset
136 terminal, and the termscript file contains all characters it sent to
Dave Love <fx@gnu.org>
parents:
diff changeset
137 the terminal. The use of the directory `~/' prevents interference
Dave Love <fx@gnu.org>
parents:
diff changeset
138 with any other user.
Dave Love <fx@gnu.org>
parents:
diff changeset
139
Dave Love <fx@gnu.org>
parents:
diff changeset
140 If you have irreproducible display problems, put those two expressions
Dave Love <fx@gnu.org>
parents:
diff changeset
141 in your ~/.emacs file. When the problem happens, exit the Emacs that
Dave Love <fx@gnu.org>
parents:
diff changeset
142 you were running, kill it, and rename the two files. Then you can start
Dave Love <fx@gnu.org>
parents:
diff changeset
143 another Emacs without clobbering those files, and use it to examine them.