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