Mercurial > emacs
annotate etc/DEBUG @ 61263:56619c3aaf99
(fancy-splash-text): Shorten default text of
"Emacs Tutorial" line. Also, if the current language env
indicates an available tutorial file other than TUTORIAL,
extract its title and append it to the line in parentheses.
(fancy-splash-insert): If arg is a thunk, funcall it.
author | Thien-Thi Nguyen <ttn@gnuvola.org> |
---|---|
date | Mon, 04 Apr 2005 07:41:58 +0000 |
parents | ec7a860cdd57 |
children | 58942e3c1b56 e4694597cbf4 |
rev | line source |
---|---|
25853 | 1 Debugging GNU Emacs |
60334
ec7a860cdd57
Add information about `-fno-crossjumping' for GCC.
David Kastrup <dak@gnu.org>
parents:
59939
diff
changeset
|
2 Copyright (c) 1985, 2000, 2001, 2005 Free Software Foundation, Inc. |
25853 | 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 | |
35655
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
15 [People who debug Emacs on Windows using native Windows debuggers |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
16 should read the Windows-specific section near the end of this |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
17 document.] |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
18 |
43432
7fe131ded6d9
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
43106
diff
changeset
|
19 ** When you debug Emacs with GDB, you should start it in the directory |
59939 | 20 where the executable was made. That directory has a .gdbinit file |
21 that defines various "user-defined" commands for debugging Emacs. | |
43432
7fe131ded6d9
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
43106
diff
changeset
|
22 |
60334
ec7a860cdd57
Add information about `-fno-crossjumping' for GCC.
David Kastrup <dak@gnu.org>
parents:
59939
diff
changeset
|
23 ** When you are trying to analyze failed assertions, it will be |
ec7a860cdd57
Add information about `-fno-crossjumping' for GCC.
David Kastrup <dak@gnu.org>
parents:
59939
diff
changeset
|
24 essential to compile Emacs either completely without optimizations or |
ec7a860cdd57
Add information about `-fno-crossjumping' for GCC.
David Kastrup <dak@gnu.org>
parents:
59939
diff
changeset
|
25 at least (when using GCC) with the -fno-crossjumping option. Failure |
ec7a860cdd57
Add information about `-fno-crossjumping' for GCC.
David Kastrup <dak@gnu.org>
parents:
59939
diff
changeset
|
26 to do so may make the compiler recycle the same abort call for all |
ec7a860cdd57
Add information about `-fno-crossjumping' for GCC.
David Kastrup <dak@gnu.org>
parents:
59939
diff
changeset
|
27 assertions in a given function, rendering the stack backtrace useless |
ec7a860cdd57
Add information about `-fno-crossjumping' for GCC.
David Kastrup <dak@gnu.org>
parents:
59939
diff
changeset
|
28 for identifying the specific failed assertion. |
ec7a860cdd57
Add information about `-fno-crossjumping' for GCC.
David Kastrup <dak@gnu.org>
parents:
59939
diff
changeset
|
29 |
43432
7fe131ded6d9
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
43106
diff
changeset
|
30 ** It is a good idea to run Emacs under GDB (or some other suitable |
35655
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
31 debugger) *all the time*. Then, when Emacs crashes, you will be able |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
32 to debug the live process, not just a core dump. (This is especially |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
33 important on systems which don't support core files, and instead print |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
34 just the registers and some stack addresses.) |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
35 |
43432
7fe131ded6d9
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
43106
diff
changeset
|
36 ** If Emacs hangs, or seems to be stuck in some infinite loop, typing |
35655
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
37 "kill -TSTP PID", where PID is the Emacs process ID, will cause GDB to |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
38 kick in, provided that you run under GDB. |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
39 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
40 ** Getting control to the debugger |
25853 | 41 |
35791
7c5f4564ff27
Changes, clean-ups, and typo fixes from Richard Stallman.
Eli Zaretskii <eliz@gnu.org>
parents:
35720
diff
changeset
|
42 `Fsignal' is a very useful place to put a breakpoint in. |
25853 | 43 All Lisp errors go through there. |
44 | |
35791
7c5f4564ff27
Changes, clean-ups, and typo fixes from Richard Stallman.
Eli Zaretskii <eliz@gnu.org>
parents:
35720
diff
changeset
|
45 It is useful, when debugging, to have a guaranteed way to return to |
44813
927a6a3e6c8f
Tell them to use C-z, not C-c, to stop Emacs under X.
Eli Zaretskii <eliz@gnu.org>
parents:
43432
diff
changeset
|
46 the debugger at any time. When using X, this is easy: type C-z at the |
35791
7c5f4564ff27
Changes, clean-ups, and typo fixes from Richard Stallman.
Eli Zaretskii <eliz@gnu.org>
parents:
35720
diff
changeset
|
47 window where Emacs is running under GDB, and it will stop Emacs just |
7c5f4564ff27
Changes, clean-ups, and typo fixes from Richard Stallman.
Eli Zaretskii <eliz@gnu.org>
parents:
35720
diff
changeset
|
48 as it would stop any ordinary program. When Emacs is running in a |
7c5f4564ff27
Changes, clean-ups, and typo fixes from Richard Stallman.
Eli Zaretskii <eliz@gnu.org>
parents:
35720
diff
changeset
|
49 terminal, things are not so easy. |
7c5f4564ff27
Changes, clean-ups, and typo fixes from Richard Stallman.
Eli Zaretskii <eliz@gnu.org>
parents:
35720
diff
changeset
|
50 |
7c5f4564ff27
Changes, clean-ups, and typo fixes from Richard Stallman.
Eli Zaretskii <eliz@gnu.org>
parents:
35720
diff
changeset
|
51 The src/.gdbinit file in the Emacs distribution arranges for SIGINT |
7c5f4564ff27
Changes, clean-ups, and typo fixes from Richard Stallman.
Eli Zaretskii <eliz@gnu.org>
parents:
35720
diff
changeset
|
52 (C-g in Emacs) to be passed to Emacs and not give control back to GDB. |
7c5f4564ff27
Changes, clean-ups, and typo fixes from Richard Stallman.
Eli Zaretskii <eliz@gnu.org>
parents:
35720
diff
changeset
|
53 On modern POSIX systems, you can override that with this command: |
7c5f4564ff27
Changes, clean-ups, and typo fixes from Richard Stallman.
Eli Zaretskii <eliz@gnu.org>
parents:
35720
diff
changeset
|
54 |
43106
cd4549362019
Fix a typo in "handle SIGINT" command.
Eli Zaretskii <eliz@gnu.org>
parents:
41839
diff
changeset
|
55 handle SIGINT stop nopass |
35791
7c5f4564ff27
Changes, clean-ups, and typo fixes from Richard Stallman.
Eli Zaretskii <eliz@gnu.org>
parents:
35720
diff
changeset
|
56 |
7c5f4564ff27
Changes, clean-ups, and typo fixes from Richard Stallman.
Eli Zaretskii <eliz@gnu.org>
parents:
35720
diff
changeset
|
57 After this `handle' command, SIGINT will return control to GDB. If |
7c5f4564ff27
Changes, clean-ups, and typo fixes from Richard Stallman.
Eli Zaretskii <eliz@gnu.org>
parents:
35720
diff
changeset
|
58 you want the C-g to cause a QUIT within Emacs as well, omit the |
7c5f4564ff27
Changes, clean-ups, and typo fixes from Richard Stallman.
Eli Zaretskii <eliz@gnu.org>
parents:
35720
diff
changeset
|
59 `nopass'. |
7c5f4564ff27
Changes, clean-ups, and typo fixes from Richard Stallman.
Eli Zaretskii <eliz@gnu.org>
parents:
35720
diff
changeset
|
60 |
7c5f4564ff27
Changes, clean-ups, and typo fixes from Richard Stallman.
Eli Zaretskii <eliz@gnu.org>
parents:
35720
diff
changeset
|
61 A technique that can work when `handle SIGINT' does not is to store |
7c5f4564ff27
Changes, clean-ups, and typo fixes from Richard Stallman.
Eli Zaretskii <eliz@gnu.org>
parents:
35720
diff
changeset
|
62 the code for some character into the variable stop_character. Thus, |
25853 | 63 |
64 set stop_character = 29 | |
65 | |
66 makes Control-] (decimal code 29) the stop character. | |
67 Typing Control-] will cause immediate stop. You cannot | |
68 use the set command until the inferior process has been started. | |
69 Put a breakpoint early in `main', or suspend the Emacs, | |
70 to get an opportunity to do the set command. | |
71 | |
59613
1c3d052ef4bf
Suggest separate terminal for debug session.
Nick Roberts <nickrob@snap.net.nz>
parents:
58969
diff
changeset
|
72 When Emacs is running in a terminal, it is useful to use a separate terminal |
1c3d052ef4bf
Suggest separate terminal for debug session.
Nick Roberts <nickrob@snap.net.nz>
parents:
58969
diff
changeset
|
73 for the debug session. This can be done by starting Emacs as usual, then |
1c3d052ef4bf
Suggest separate terminal for debug session.
Nick Roberts <nickrob@snap.net.nz>
parents:
58969
diff
changeset
|
74 attaching to it from gdb with the `attach' command which is explained in the |
1c3d052ef4bf
Suggest separate terminal for debug session.
Nick Roberts <nickrob@snap.net.nz>
parents:
58969
diff
changeset
|
75 node "Attach" of the GDB manual. |
1c3d052ef4bf
Suggest separate terminal for debug session.
Nick Roberts <nickrob@snap.net.nz>
parents:
58969
diff
changeset
|
76 |
25853 | 77 ** Examining Lisp object values. |
78 | |
79 When you have a live process to debug, and it has not encountered a | |
80 fatal error, you can use the GDB command `pr'. First print the value | |
81 in the ordinary way, with the `p' command. Then type `pr' with no | |
82 arguments. This calls a subroutine which uses the Lisp printer. | |
83 | |
57307 | 84 You can also use `pp value' to print the emacs value directly. |
85 | |
86 Note: It is not a good idea to try `pr' or `pp' if you know that Emacs | |
87 is in deep trouble: its stack smashed (e.g., if it encountered SIGSEGV | |
88 due to stack overflow), or crucial data structures, such as `obarray', | |
35655
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
89 corrupted, etc. In such cases, the Emacs subroutine called by `pr' |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
90 might make more damage, like overwrite some data that is important for |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
91 debugging the original problem. |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
92 |
35791
7c5f4564ff27
Changes, clean-ups, and typo fixes from Richard Stallman.
Eli Zaretskii <eliz@gnu.org>
parents:
35720
diff
changeset
|
93 Also, on some systems it is impossible to use `pr' if you stopped |
7c5f4564ff27
Changes, clean-ups, and typo fixes from Richard Stallman.
Eli Zaretskii <eliz@gnu.org>
parents:
35720
diff
changeset
|
94 Emacs while it was inside `select'. This is in fact what happens if |
7c5f4564ff27
Changes, clean-ups, and typo fixes from Richard Stallman.
Eli Zaretskii <eliz@gnu.org>
parents:
35720
diff
changeset
|
95 you stop Emacs while it is waiting. In such a situation, don't try to |
7c5f4564ff27
Changes, clean-ups, and typo fixes from Richard Stallman.
Eli Zaretskii <eliz@gnu.org>
parents:
35720
diff
changeset
|
96 use `pr'. Instead, use `s' to step out of the system call. Then |
7c5f4564ff27
Changes, clean-ups, and typo fixes from Richard Stallman.
Eli Zaretskii <eliz@gnu.org>
parents:
35720
diff
changeset
|
97 Emacs will be between instructions and capable of handling `pr'. |
25853 | 98 |
35791
7c5f4564ff27
Changes, clean-ups, and typo fixes from Richard Stallman.
Eli Zaretskii <eliz@gnu.org>
parents:
35720
diff
changeset
|
99 If you can't use `pr' command, for whatever reason, you can fall back |
7c5f4564ff27
Changes, clean-ups, and typo fixes from Richard Stallman.
Eli Zaretskii <eliz@gnu.org>
parents:
35720
diff
changeset
|
100 on lower-level commands. Use the `xtype' command to print out the |
7c5f4564ff27
Changes, clean-ups, and typo fixes from Richard Stallman.
Eli Zaretskii <eliz@gnu.org>
parents:
35720
diff
changeset
|
101 data type of the last data value. Once you know the data type, use |
7c5f4564ff27
Changes, clean-ups, and typo fixes from Richard Stallman.
Eli Zaretskii <eliz@gnu.org>
parents:
35720
diff
changeset
|
102 the command that corresponds to that type. Here are these commands: |
25853 | 103 |
104 xint xptr xwindow xmarker xoverlay xmiscfree xintfwd xboolfwd xobjfwd | |
105 xbufobjfwd xkbobjfwd xbuflocal xbuffer xsymbol xstring xvector xframe | |
106 xwinconfig xcompiled xcons xcar xcdr xsubr xprocess xfloat xscrollbar | |
107 | |
108 Each one of them applies to a certain type or class of types. | |
109 (Some of these types are not visible in Lisp, because they exist only | |
110 internally.) | |
111 | |
112 Each x... command prints some information about the value, and | |
113 produces a GDB value (subsequently available in $) through which you | |
114 can get at the rest of the contents. | |
115 | |
35655
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
116 In general, most of the rest of the contents will be additional Lisp |
25853 | 117 objects which you can examine in turn with the x... commands. |
118 | |
35655
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
119 Even with a live process, these x... commands are useful for |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
120 examining the fields in a buffer, window, process, frame or marker. |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
121 Here's an example using concepts explained in the node "Value History" |
58969
eae7969f1b06
Change printing example to break on a procedure name.
Nick Roberts <nickrob@snap.net.nz>
parents:
57307
diff
changeset
|
122 of the GDB manual to print values associated with the variable |
eae7969f1b06
Change printing example to break on a procedure name.
Nick Roberts <nickrob@snap.net.nz>
parents:
57307
diff
changeset
|
123 called frame. First, use these commands: |
35655
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
124 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
125 cd src |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
126 gdb emacs |
58969
eae7969f1b06
Change printing example to break on a procedure name.
Nick Roberts <nickrob@snap.net.nz>
parents:
57307
diff
changeset
|
127 b set_frame_buffer_list |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49489
diff
changeset
|
128 r -q |
35655
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
129 |
59613
1c3d052ef4bf
Suggest separate terminal for debug session.
Nick Roberts <nickrob@snap.net.nz>
parents:
58969
diff
changeset
|
130 Then Emacs hits the breakpoint: |
35655
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
131 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
132 (gdb) p frame |
58969
eae7969f1b06
Change printing example to break on a procedure name.
Nick Roberts <nickrob@snap.net.nz>
parents:
57307
diff
changeset
|
133 $1 = 139854428 |
35655
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
134 (gdb) xtype |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
135 Lisp_Vectorlike |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
136 PVEC_FRAME |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
137 (gdb) xframe |
58969
eae7969f1b06
Change printing example to break on a procedure name.
Nick Roberts <nickrob@snap.net.nz>
parents:
57307
diff
changeset
|
138 $2 = (struct frame *) 0x8560258 |
35655
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
139 (gdb) p *$ |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
140 $3 = { |
58969
eae7969f1b06
Change printing example to break on a procedure name.
Nick Roberts <nickrob@snap.net.nz>
parents:
57307
diff
changeset
|
141 size = 1073742931, |
eae7969f1b06
Change printing example to break on a procedure name.
Nick Roberts <nickrob@snap.net.nz>
parents:
57307
diff
changeset
|
142 next = 0x85dfe58, |
eae7969f1b06
Change printing example to break on a procedure name.
Nick Roberts <nickrob@snap.net.nz>
parents:
57307
diff
changeset
|
143 name = 140615219, |
35655
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
144 [...] |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
145 } |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
146 (gdb) p $3->name |
58969
eae7969f1b06
Change printing example to break on a procedure name.
Nick Roberts <nickrob@snap.net.nz>
parents:
57307
diff
changeset
|
147 $4 = 140615219 |
35655
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
148 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
149 Now we can use `pr' to print the name of the frame: |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
150 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
151 (gdb) pr |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
152 "emacs@steenrod.math.nwu.edu" |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
153 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
154 The Emacs C code heavily uses macros defined in lisp.h. So suppose |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
155 we want the address of the l-value expression near the bottom of |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
156 `add_command_key' from keyboard.c: |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
157 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
158 XVECTOR (this_command_keys)->contents[this_command_key_count++] = key; |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
159 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
160 XVECTOR is a macro, and therefore GDB does not know about it. |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
161 GDB cannot evaluate "p XVECTOR (this_command_keys)". |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
162 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
163 However, you can use the xvector command in GDB to get the same |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
164 result. Here is how: |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
165 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
166 (gdb) p this_command_keys |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
167 $1 = 1078005760 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
168 (gdb) xvector |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
169 $2 = (struct Lisp_Vector *) 0x411000 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
170 0 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
171 (gdb) p $->contents[this_command_key_count] |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
172 $3 = 1077872640 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
173 (gdb) p &$ |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
174 $4 = (int *) 0x411008 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
175 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
176 Here's a related example of macros and the GDB `define' command. |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
177 There are many Lisp vectors such as `recent_keys', which contains the |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
178 last 100 keystrokes. We can print this Lisp vector |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
179 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
180 p recent_keys |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
181 pr |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
182 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
183 But this may be inconvenient, since `recent_keys' is much more verbose |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
184 than `C-h l'. We might want to print only the last 10 elements of |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
185 this vector. `recent_keys' is updated in keyboard.c by the command |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
186 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
187 XVECTOR (recent_keys)->contents[recent_keys_index] = c; |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
188 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
189 So we define a GDB command `xvector-elts', so the last 10 keystrokes |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49489
diff
changeset
|
190 are printed by |
35655
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
191 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
192 xvector-elts recent_keys recent_keys_index 10 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
193 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
194 where you can define xvector-elts as follows: |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
195 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
196 define xvector-elts |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
197 set $i = 0 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
198 p $arg0 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
199 xvector |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
200 set $foo = $ |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
201 while $i < $arg2 |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49489
diff
changeset
|
202 p $foo->contents[$arg1-($i++)] |
35655
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
203 pr |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
204 end |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
205 document xvector-elts |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
206 Prints a range of elements of a Lisp vector. |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
207 xvector-elts v n i |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
208 prints `i' elements of the vector `v' ending at the index `n'. |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
209 end |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
210 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
211 ** Getting Lisp-level backtrace information within GDB |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
212 |
35791
7c5f4564ff27
Changes, clean-ups, and typo fixes from Richard Stallman.
Eli Zaretskii <eliz@gnu.org>
parents:
35720
diff
changeset
|
213 The most convenient way is to use the `xbacktrace' command. This |
7c5f4564ff27
Changes, clean-ups, and typo fixes from Richard Stallman.
Eli Zaretskii <eliz@gnu.org>
parents:
35720
diff
changeset
|
214 shows the names of the Lisp functions that are currently active. |
35655
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
215 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
216 If that doesn't work (e.g., because the `backtrace_list' structure is |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
217 corrupted), type "bt" at the GDB prompt, to produce the C-level |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
218 backtrace, and look for stack frames that call Ffuncall. Select them |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
219 one by one in GDB, by typing "up N", where N is the appropriate number |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
220 of frames to go up, and in each frame that calls Ffuncall type this: |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
221 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
222 p *args |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
223 pr |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
224 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
225 This will print the name of the Lisp function called by that level |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
226 of function calling. |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
227 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
228 By printing the remaining elements of args, you can see the argument |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
229 values. Here's how to print the first argument: |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49489
diff
changeset
|
230 |
35655
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
231 p args[1] |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
232 pr |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
233 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
234 If you do not have a live process, you can use xtype and the other |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
235 x... commands such as xsymbol to get such information, albeit less |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
236 conveniently. For example: |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
237 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
238 p *args |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
239 xtype |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
240 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
241 and, assuming that "xtype" says that args[0] is a symbol: |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
242 |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49489
diff
changeset
|
243 xsymbol |
35655
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
244 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
245 ** Debugging what happens while preloading and dumping Emacs |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
246 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
247 Type `gdb temacs' and start it with `r -batch -l loadup dump'. |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
248 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
249 If temacs actually succeeds when running under GDB in this way, do not |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
250 try to run the dumped Emacs, because it was dumped with the GDB |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
251 breakpoints in it. |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
252 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
253 ** Debugging `temacs' |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
254 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
255 Debugging `temacs' is useful when you want to establish whether a |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
256 problem happens in an undumped Emacs. To run `temacs' under a |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
257 debugger, type "gdb temacs", then start it with `r -batch -l loadup'. |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
258 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
259 ** If you encounter X protocol errors |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
260 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
261 Try evaluating (x-synchronize t). That puts Emacs into synchronous |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
262 mode, where each Xlib call checks for errors before it returns. This |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
263 mode is much slower, but when you get an error, you will see exactly |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
264 which call really caused the error. |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
265 |
36962
9c7eb7e6bf3e
Document the use of -xrm to start EMacs in synchronous mode.
Eli Zaretskii <eliz@gnu.org>
parents:
36625
diff
changeset
|
266 You can start Emacs in a synchronous mode by invoking it with the -xrm |
9c7eb7e6bf3e
Document the use of -xrm to start EMacs in synchronous mode.
Eli Zaretskii <eliz@gnu.org>
parents:
36625
diff
changeset
|
267 option, like this: |
9c7eb7e6bf3e
Document the use of -xrm to start EMacs in synchronous mode.
Eli Zaretskii <eliz@gnu.org>
parents:
36625
diff
changeset
|
268 |
37534
3ea5075dc420
Fix a typo in the "emacs -xrm" command line. Reported by Kenichi Handa.
Eli Zaretskii <eliz@gnu.org>
parents:
37509
diff
changeset
|
269 emacs -xrm "emacs.synchronous: true" |
36962
9c7eb7e6bf3e
Document the use of -xrm to start EMacs in synchronous mode.
Eli Zaretskii <eliz@gnu.org>
parents:
36625
diff
changeset
|
270 |
9c7eb7e6bf3e
Document the use of -xrm to start EMacs in synchronous mode.
Eli Zaretskii <eliz@gnu.org>
parents:
36625
diff
changeset
|
271 Setting a breakpoint in the function `x_error_quitter' and looking at |
9c7eb7e6bf3e
Document the use of -xrm to start EMacs in synchronous mode.
Eli Zaretskii <eliz@gnu.org>
parents:
36625
diff
changeset
|
272 the backtrace when Emacs stops inside that function will show what |
9c7eb7e6bf3e
Document the use of -xrm to start EMacs in synchronous mode.
Eli Zaretskii <eliz@gnu.org>
parents:
36625
diff
changeset
|
273 code causes the X protocol errors. |
9c7eb7e6bf3e
Document the use of -xrm to start EMacs in synchronous mode.
Eli Zaretskii <eliz@gnu.org>
parents:
36625
diff
changeset
|
274 |
41839
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
275 Some bugs related to the X protocol disappear when Emacs runs in a |
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
276 synchronous mode. To track down those bugs, we suggest the following |
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
277 procedure: |
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
278 |
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
279 - Run Emacs under a debugger and put a breakpoint inside the |
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
280 primitive function which, when called from Lisp, triggers the X |
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
281 protocol errors. For example, if the errors happen when you |
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
282 delete a frame, put a breakpoint inside `Fdelete_frame'. |
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
283 |
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
284 - When the breakpoint breaks, step through the code, looking for |
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
285 calls to X functions (the ones whose names begin with "X" or |
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
286 "Xt" or "Xm"). |
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
287 |
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
288 - Insert calls to `XSync' before and after each call to the X |
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
289 functions, like this: |
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
290 |
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
291 XSync (f->output_data.x->display_info->display, 0); |
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
292 |
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
293 where `f' is the pointer to the `struct frame' of the selected |
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
294 frame, normally available via XFRAME (selected_frame). (Most |
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
295 functions which call X already have some variable that holds the |
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
296 pointer to the frame, perhaps called `f' or `sf', so you shouldn't |
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
297 need to compute it.) |
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
298 |
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
299 If your debugger can call functions in the program being debugged, |
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
300 you should be able to issue the calls to `XSync' without recompiling |
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
301 Emacs. For example, with GDB, just type: |
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
302 |
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
303 call XSync (f->output_data.x->display_info->display, 0) |
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
304 |
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
305 before and immediately after the suspect X calls. If your |
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
306 debugger does not support this, you will need to add these pairs |
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
307 of calls in the source and rebuild Emacs. |
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
308 |
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
309 Either way, systematically step through the code and issue these |
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
310 calls until you find the first X function called by Emacs after |
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
311 which a call to `XSync' winds up in the function |
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
312 `x_error_quitter'. The first X function call for which this |
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
313 happens is the one that generated the X protocol error. |
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
314 |
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
315 - You should now look around this offending X call and try to figure |
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
316 out what is wrong with it. |
902e47b4907b
Advice how to debug X protocol error which disappear in the
Eli Zaretskii <eliz@gnu.org>
parents:
40348
diff
changeset
|
317 |
49489 | 318 ** If Emacs causes errors or memory leaks in your X server |
319 | |
320 You can trace the traffic between Emacs and your X server with a tool | |
321 like xmon, available at ftp://ftp.x.org/contrib/devel_tools/. | |
322 | |
323 Xmon can be used to see exactly what Emacs sends when X protocol errors | |
324 happen. If Emacs causes the X server memory usage to increase you can | |
325 use xmon to see what items Emacs creates in the server (windows, | |
326 graphical contexts, pixmaps) and what items Emacs delete. If there | |
327 are consistently more creations than deletions, the type of item | |
328 and the activity you do when the items get created can give a hint where | |
329 to start debugging. | |
330 | |
35655
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
331 ** If the symptom of the bug is that Emacs fails to respond |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
332 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
333 Don't assume Emacs is `hung'--it may instead be in an infinite loop. |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
334 To find out which, make the problem happen under GDB and stop Emacs |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
335 once it is not responding. (If Emacs is using X Windows directly, you |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
336 can stop Emacs by typing C-z at the GDB job.) Then try stepping with |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
337 `step'. If Emacs is hung, the `step' command won't return. If it is |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
338 looping, `step' will return. |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
339 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
340 If this shows Emacs is hung in a system call, stop it again and |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
341 examine the arguments of the call. If you report the bug, it is very |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
342 important to state exactly where in the source the system call is, and |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
343 what the arguments are. |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
344 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
345 If Emacs is in an infinite loop, try to determine where the loop |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
346 starts and ends. The easiest way to do this is to use the GDB command |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
347 `finish'. Each time you use it, Emacs resumes execution until it |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
348 exits one stack frame. Keep typing `finish' until it doesn't |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
349 return--that means the infinite loop is in the stack frame which you |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
350 just tried to finish. |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
351 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
352 Stop Emacs again, and use `finish' repeatedly again until you get back |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
353 to that frame. Then use `next' to step through that frame. By |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
354 stepping, you will see where the loop starts and ends. Also, examine |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
355 the data being used in the loop and try to determine why the loop does |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
356 not exit when it should. |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
357 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
358 ** If certain operations in Emacs are slower than they used to be, here |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
359 is some advice for how to find out why. |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
360 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
361 Stop Emacs repeatedly during the slow operation, and make a backtrace |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
362 each time. Compare the backtraces looking for a pattern--a specific |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
363 function that shows up more often than you'd expect. |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
364 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
365 If you don't see a pattern in the C backtraces, get some Lisp |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
366 backtrace information by typing "xbacktrace" or by looking at Ffuncall |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
367 frames (see above), and again look for a pattern. |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
368 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
369 When using X, you can stop Emacs at any time by typing C-z at GDB. |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
370 When not using X, you can do this with C-g. On non-Unix platforms, |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
371 such as MS-DOS, you might need to press C-BREAK instead. |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
372 |
25853 | 373 ** If GDB does not run and your debuggers can't load Emacs. |
374 | |
375 On some systems, no debugger can load Emacs with a symbol table, | |
376 perhaps because they all have fixed limits on the number of symbols | |
377 and Emacs exceeds the limits. Here is a method that can be used | |
378 in such an extremity. Do | |
379 | |
380 nm -n temacs > nmout | |
381 strip temacs | |
382 adb temacs | |
383 0xd:i | |
384 0xe:i | |
385 14:i | |
386 17:i | |
387 :r -l loadup (or whatever) | |
388 | |
389 It is necessary to refer to the file `nmout' to convert | |
390 numeric addresses into symbols and vice versa. | |
391 | |
392 It is useful to be running under a window system. | |
393 Then, if Emacs becomes hopelessly wedged, you can create | |
394 another window to do kill -9 in. kill -ILL is often | |
395 useful too, since that may make Emacs dump core or return | |
396 to adb. | |
397 | |
398 | |
399 ** Debugging incorrect screen updating. | |
400 | |
401 To debug Emacs problems that update the screen wrong, it is useful | |
402 to have a record of what input you typed and what Emacs sent to the | |
403 screen. To make these records, do | |
404 | |
405 (open-dribble-file "~/.dribble") | |
406 (open-termscript "~/.termscript") | |
407 | |
408 The dribble file contains all characters read by Emacs from the | |
409 terminal, and the termscript file contains all characters it sent to | |
410 the terminal. The use of the directory `~/' prevents interference | |
411 with any other user. | |
412 | |
413 If you have irreproducible display problems, put those two expressions | |
414 in your ~/.emacs file. When the problem happens, exit the Emacs that | |
415 you were running, kill it, and rename the two files. Then you can start | |
416 another Emacs without clobbering those files, and use it to examine them. | |
34594
9b989029cccf
Add note aboute using `inverse-video' to detect excessive screen redraw.
Miles Bader <miles@gnu.org>
parents:
32523
diff
changeset
|
417 |
9b989029cccf
Add note aboute using `inverse-video' to detect excessive screen redraw.
Miles Bader <miles@gnu.org>
parents:
32523
diff
changeset
|
418 An easy way to see if too much text is being redrawn on a terminal is to |
9b989029cccf
Add note aboute using `inverse-video' to detect excessive screen redraw.
Miles Bader <miles@gnu.org>
parents:
32523
diff
changeset
|
419 evaluate `(setq inverse-video t)' before you try the operation you think |
9b989029cccf
Add note aboute using `inverse-video' to detect excessive screen redraw.
Miles Bader <miles@gnu.org>
parents:
32523
diff
changeset
|
420 will cause too much redrawing. This doesn't refresh the screen, so only |
9b989029cccf
Add note aboute using `inverse-video' to detect excessive screen redraw.
Miles Bader <miles@gnu.org>
parents:
32523
diff
changeset
|
421 newly drawn text is in inverse video. |
35655
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
422 |
37509
ed5dca63a0ed
Document some of the facilities for debugging display code, including
Eli Zaretskii <eliz@gnu.org>
parents:
37481
diff
changeset
|
423 The Emacs display code includes special debugging code, but it is |
ed5dca63a0ed
Document some of the facilities for debugging display code, including
Eli Zaretskii <eliz@gnu.org>
parents:
37481
diff
changeset
|
424 normally disabled. You can enable it by building Emacs with the |
ed5dca63a0ed
Document some of the facilities for debugging display code, including
Eli Zaretskii <eliz@gnu.org>
parents:
37481
diff
changeset
|
425 pre-processing symbol GLYPH_DEBUG defined. Here's one easy way, |
ed5dca63a0ed
Document some of the facilities for debugging display code, including
Eli Zaretskii <eliz@gnu.org>
parents:
37481
diff
changeset
|
426 suitable for Unix and GNU systems, to build such a debugging version: |
ed5dca63a0ed
Document some of the facilities for debugging display code, including
Eli Zaretskii <eliz@gnu.org>
parents:
37481
diff
changeset
|
427 |
ed5dca63a0ed
Document some of the facilities for debugging display code, including
Eli Zaretskii <eliz@gnu.org>
parents:
37481
diff
changeset
|
428 MYCPPFLAGS='-DGLYPH_DEBUG=1' make |
ed5dca63a0ed
Document some of the facilities for debugging display code, including
Eli Zaretskii <eliz@gnu.org>
parents:
37481
diff
changeset
|
429 |
ed5dca63a0ed
Document some of the facilities for debugging display code, including
Eli Zaretskii <eliz@gnu.org>
parents:
37481
diff
changeset
|
430 Building Emacs like that activates many assertions which scrutinize |
ed5dca63a0ed
Document some of the facilities for debugging display code, including
Eli Zaretskii <eliz@gnu.org>
parents:
37481
diff
changeset
|
431 display code operation more than Emacs does normally. (To see the |
ed5dca63a0ed
Document some of the facilities for debugging display code, including
Eli Zaretskii <eliz@gnu.org>
parents:
37481
diff
changeset
|
432 code which tests these assertions, look for calls to the `xassert' |
ed5dca63a0ed
Document some of the facilities for debugging display code, including
Eli Zaretskii <eliz@gnu.org>
parents:
37481
diff
changeset
|
433 macros.) Any assertion that is reported to fail should be |
ed5dca63a0ed
Document some of the facilities for debugging display code, including
Eli Zaretskii <eliz@gnu.org>
parents:
37481
diff
changeset
|
434 investigated. |
ed5dca63a0ed
Document some of the facilities for debugging display code, including
Eli Zaretskii <eliz@gnu.org>
parents:
37481
diff
changeset
|
435 |
ed5dca63a0ed
Document some of the facilities for debugging display code, including
Eli Zaretskii <eliz@gnu.org>
parents:
37481
diff
changeset
|
436 Building with GLYPH_DEBUG defined also defines several helper |
ed5dca63a0ed
Document some of the facilities for debugging display code, including
Eli Zaretskii <eliz@gnu.org>
parents:
37481
diff
changeset
|
437 functions which can help debugging display code. One such function is |
ed5dca63a0ed
Document some of the facilities for debugging display code, including
Eli Zaretskii <eliz@gnu.org>
parents:
37481
diff
changeset
|
438 `dump_glyph_matrix'. If you run Emacs under GDB, you can print the |
ed5dca63a0ed
Document some of the facilities for debugging display code, including
Eli Zaretskii <eliz@gnu.org>
parents:
37481
diff
changeset
|
439 contents of any glyph matrix by just calling that function with the |
ed5dca63a0ed
Document some of the facilities for debugging display code, including
Eli Zaretskii <eliz@gnu.org>
parents:
37481
diff
changeset
|
440 matrix as its argument. For example, the following command will print |
ed5dca63a0ed
Document some of the facilities for debugging display code, including
Eli Zaretskii <eliz@gnu.org>
parents:
37481
diff
changeset
|
441 the contents of the current matrix of the window whose pointer is in |
ed5dca63a0ed
Document some of the facilities for debugging display code, including
Eli Zaretskii <eliz@gnu.org>
parents:
37481
diff
changeset
|
442 `w': |
ed5dca63a0ed
Document some of the facilities for debugging display code, including
Eli Zaretskii <eliz@gnu.org>
parents:
37481
diff
changeset
|
443 |
ed5dca63a0ed
Document some of the facilities for debugging display code, including
Eli Zaretskii <eliz@gnu.org>
parents:
37481
diff
changeset
|
444 (gdb) p dump_glyph_matrix (w->current_matrix, 2) |
ed5dca63a0ed
Document some of the facilities for debugging display code, including
Eli Zaretskii <eliz@gnu.org>
parents:
37481
diff
changeset
|
445 |
ed5dca63a0ed
Document some of the facilities for debugging display code, including
Eli Zaretskii <eliz@gnu.org>
parents:
37481
diff
changeset
|
446 (The second argument 2 tells dump_glyph_matrix to print the glyphs in |
ed5dca63a0ed
Document some of the facilities for debugging display code, including
Eli Zaretskii <eliz@gnu.org>
parents:
37481
diff
changeset
|
447 a long form.) You can dump the selected window's current glyph matrix |
ed5dca63a0ed
Document some of the facilities for debugging display code, including
Eli Zaretskii <eliz@gnu.org>
parents:
37481
diff
changeset
|
448 interactively with "M-x dump-glyph-matrix RET"; see the documentation |
ed5dca63a0ed
Document some of the facilities for debugging display code, including
Eli Zaretskii <eliz@gnu.org>
parents:
37481
diff
changeset
|
449 of this function for more details. |
ed5dca63a0ed
Document some of the facilities for debugging display code, including
Eli Zaretskii <eliz@gnu.org>
parents:
37481
diff
changeset
|
450 |
ed5dca63a0ed
Document some of the facilities for debugging display code, including
Eli Zaretskii <eliz@gnu.org>
parents:
37481
diff
changeset
|
451 Several more functions for debugging display code are available in |
37565 | 452 Emacs compiled with GLYPH_DEBUG defined; type "C-h f dump- TAB" and |
453 "C-h f trace- TAB" to see the full list. | |
37509
ed5dca63a0ed
Document some of the facilities for debugging display code, including
Eli Zaretskii <eliz@gnu.org>
parents:
37481
diff
changeset
|
454 |
57307 | 455 When you debug display problems running emacs under X, you can use |
456 the `ff' command to flush all pending display updates to the screen. | |
457 | |
35655
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
458 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
459 ** Debugging LessTif |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
460 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
461 If you encounter bugs whereby Emacs built with LessTif grabs all mouse |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
462 and keyboard events, or LessTif menus behave weirdly, it might be |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
463 helpful to set the `DEBUGSOURCES' and `DEBUG_FILE' environment |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
464 variables, so that one can see what LessTif was doing at this point. |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
465 For instance |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49489
diff
changeset
|
466 |
36625
08aed53e171c
DEBUGSOURCES should contain a list of files, separated by colons.
Gerd Moellmann <gerd@gnu.org>
parents:
35861
diff
changeset
|
467 export DEBUGSOURCES="RowColumn.c:MenuShell.c:MenuUtil.c" |
35655
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
468 export DEBUG_FILE=/usr/tmp/LESSTIF_TRACE |
35720
c6ae90d82552
Clarify the instructions for debugging LessTif.
Eli Zaretskii <eliz@gnu.org>
parents:
35655
diff
changeset
|
469 emacs & |
35655
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
470 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
471 causes LessTif to print traces from the three named source files to a |
35720
c6ae90d82552
Clarify the instructions for debugging LessTif.
Eli Zaretskii <eliz@gnu.org>
parents:
35655
diff
changeset
|
472 file in `/usr/tmp' (that file can get pretty large). The above should |
c6ae90d82552
Clarify the instructions for debugging LessTif.
Eli Zaretskii <eliz@gnu.org>
parents:
35655
diff
changeset
|
473 be typed at the shell prompt before invoking Emacs, as shown by the |
c6ae90d82552
Clarify the instructions for debugging LessTif.
Eli Zaretskii <eliz@gnu.org>
parents:
35655
diff
changeset
|
474 last line above. |
35655
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
475 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
476 Running GDB from another terminal could also help with such problems. |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
477 You can arrange for GDB to run on one machine, with the Emacs display |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
478 appearing on another. Then, when the bug happens, you can go back to |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
479 the machine where you started GDB and use the debugger from there. |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
480 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
481 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
482 ** Debugging problems which happen in GC |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
483 |
37015
f8dd0e40dc34
Make it clear that last_marked[] holds pointers to Lisp objects, not
Eli Zaretskii <eliz@gnu.org>
parents:
36962
diff
changeset
|
484 The array `last_marked' (defined on alloc.c) can be used to display up |
f8dd0e40dc34
Make it clear that last_marked[] holds pointers to Lisp objects, not
Eli Zaretskii <eliz@gnu.org>
parents:
36962
diff
changeset
|
485 to 500 last objects marked by the garbage collection process. |
37076
ec5579aad1bb
Fix the wording in the last change.
Eli Zaretskii <eliz@gnu.org>
parents:
37015
diff
changeset
|
486 Whenever the garbage collector marks a Lisp object, it records the |
ec5579aad1bb
Fix the wording in the last change.
Eli Zaretskii <eliz@gnu.org>
parents:
37015
diff
changeset
|
487 pointer to that object in the `last_marked' array. The variable |
37015
f8dd0e40dc34
Make it clear that last_marked[] holds pointers to Lisp objects, not
Eli Zaretskii <eliz@gnu.org>
parents:
36962
diff
changeset
|
488 `last_marked_index' holds the index into the `last_marked' array one |
f8dd0e40dc34
Make it clear that last_marked[] holds pointers to Lisp objects, not
Eli Zaretskii <eliz@gnu.org>
parents:
36962
diff
changeset
|
489 place beyond where the pointer to the very last marked object is |
f8dd0e40dc34
Make it clear that last_marked[] holds pointers to Lisp objects, not
Eli Zaretskii <eliz@gnu.org>
parents:
36962
diff
changeset
|
490 stored. |
35655
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
491 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
492 The single most important goal in debugging GC problems is to find the |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
493 Lisp data structure that got corrupted. This is not easy since GC |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
494 changes the tag bits and relocates strings which make it hard to look |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
495 at Lisp objects with commands such as `pr'. It is sometimes necessary |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
496 to convert Lisp_Object variables into pointers to C struct's manually. |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
497 Use the `last_marked' array and the source to reconstruct the sequence |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
498 that objects were marked. |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
499 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
500 Once you discover the corrupted Lisp object or data structure, it is |
35861 | 501 useful to look at it in a fresh Emacs session and compare its contents |
502 with a session that you are debugging. | |
35655
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
503 |
37481 | 504 ** Debugging problems with non-ASCII characters |
505 | |
506 If you experience problems which seem to be related to non-ASCII | |
507 characters, such as \201 characters appearing in the buffer or in your | |
508 files, set the variable byte-debug-flag to t. This causes Emacs to do | |
509 some extra checks, such as look for broken relations between byte and | |
510 character positions in buffers and strings; the resulting diagnostics | |
511 might pinpoint the cause of the problem. | |
512 | |
40247
c824be0e27e2
Add information about debugging the tty version.
Eli Zaretskii <eliz@gnu.org>
parents:
37586
diff
changeset
|
513 ** Debugging the TTY (non-windowed) version |
c824be0e27e2
Add information about debugging the tty version.
Eli Zaretskii <eliz@gnu.org>
parents:
37586
diff
changeset
|
514 |
c824be0e27e2
Add information about debugging the tty version.
Eli Zaretskii <eliz@gnu.org>
parents:
37586
diff
changeset
|
515 The most convenient method of debugging the character-terminal display |
c824be0e27e2
Add information about debugging the tty version.
Eli Zaretskii <eliz@gnu.org>
parents:
37586
diff
changeset
|
516 is to do that on a window system such as X. Begin by starting an |
c824be0e27e2
Add information about debugging the tty version.
Eli Zaretskii <eliz@gnu.org>
parents:
37586
diff
changeset
|
517 xterm window, then type these commands inside that window: |
c824be0e27e2
Add information about debugging the tty version.
Eli Zaretskii <eliz@gnu.org>
parents:
37586
diff
changeset
|
518 |
c824be0e27e2
Add information about debugging the tty version.
Eli Zaretskii <eliz@gnu.org>
parents:
37586
diff
changeset
|
519 $ tty |
c824be0e27e2
Add information about debugging the tty version.
Eli Zaretskii <eliz@gnu.org>
parents:
37586
diff
changeset
|
520 $ echo $TERM |
c824be0e27e2
Add information about debugging the tty version.
Eli Zaretskii <eliz@gnu.org>
parents:
37586
diff
changeset
|
521 |
c824be0e27e2
Add information about debugging the tty version.
Eli Zaretskii <eliz@gnu.org>
parents:
37586
diff
changeset
|
522 Let's say these commands print "/dev/ttyp4" and "xterm", respectively. |
c824be0e27e2
Add information about debugging the tty version.
Eli Zaretskii <eliz@gnu.org>
parents:
37586
diff
changeset
|
523 |
c824be0e27e2
Add information about debugging the tty version.
Eli Zaretskii <eliz@gnu.org>
parents:
37586
diff
changeset
|
524 Now start Emacs (the normal, windowed-display session, i.e. without |
c824be0e27e2
Add information about debugging the tty version.
Eli Zaretskii <eliz@gnu.org>
parents:
37586
diff
changeset
|
525 the `-nw' option), and invoke "M-x gdb RET emacs RET" from there. Now |
c824be0e27e2
Add information about debugging the tty version.
Eli Zaretskii <eliz@gnu.org>
parents:
37586
diff
changeset
|
526 type these commands at GDB's prompt: |
c824be0e27e2
Add information about debugging the tty version.
Eli Zaretskii <eliz@gnu.org>
parents:
37586
diff
changeset
|
527 |
c824be0e27e2
Add information about debugging the tty version.
Eli Zaretskii <eliz@gnu.org>
parents:
37586
diff
changeset
|
528 (gdb) set args -nw -t /dev/ttyp4 |
c824be0e27e2
Add information about debugging the tty version.
Eli Zaretskii <eliz@gnu.org>
parents:
37586
diff
changeset
|
529 (gdb) set environment TERM xterm |
c824be0e27e2
Add information about debugging the tty version.
Eli Zaretskii <eliz@gnu.org>
parents:
37586
diff
changeset
|
530 (gdb) run |
c824be0e27e2
Add information about debugging the tty version.
Eli Zaretskii <eliz@gnu.org>
parents:
37586
diff
changeset
|
531 |
c824be0e27e2
Add information about debugging the tty version.
Eli Zaretskii <eliz@gnu.org>
parents:
37586
diff
changeset
|
532 The debugged Emacs should now start in no-window mode with its display |
c824be0e27e2
Add information about debugging the tty version.
Eli Zaretskii <eliz@gnu.org>
parents:
37586
diff
changeset
|
533 directed to the xterm window you opened above. |
c824be0e27e2
Add information about debugging the tty version.
Eli Zaretskii <eliz@gnu.org>
parents:
37586
diff
changeset
|
534 |
40348
380d8f312f3a
Mention that screen(1) can come in handy for debugging the tty version.
Eli Zaretskii <eliz@gnu.org>
parents:
40247
diff
changeset
|
535 Similar arrangement is possible on a character terminal by using the |
380d8f312f3a
Mention that screen(1) can come in handy for debugging the tty version.
Eli Zaretskii <eliz@gnu.org>
parents:
40247
diff
changeset
|
536 `screen' package. |
380d8f312f3a
Mention that screen(1) can come in handy for debugging the tty version.
Eli Zaretskii <eliz@gnu.org>
parents:
40247
diff
changeset
|
537 |
37586
c4354368031e
Add hints for running Emacs with malloc debuggers.
Eli Zaretskii <eliz@gnu.org>
parents:
37565
diff
changeset
|
538 ** Running Emacs built with malloc debugging packages |
c4354368031e
Add hints for running Emacs with malloc debuggers.
Eli Zaretskii <eliz@gnu.org>
parents:
37565
diff
changeset
|
539 |
c4354368031e
Add hints for running Emacs with malloc debuggers.
Eli Zaretskii <eliz@gnu.org>
parents:
37565
diff
changeset
|
540 If Emacs exhibits bugs that seem to be related to use of memory |
c4354368031e
Add hints for running Emacs with malloc debuggers.
Eli Zaretskii <eliz@gnu.org>
parents:
37565
diff
changeset
|
541 allocated off the heap, it might be useful to link Emacs with a |
c4354368031e
Add hints for running Emacs with malloc debuggers.
Eli Zaretskii <eliz@gnu.org>
parents:
37565
diff
changeset
|
542 special debugging library, such as Electric Fence (a.k.a. efence) or |
c4354368031e
Add hints for running Emacs with malloc debuggers.
Eli Zaretskii <eliz@gnu.org>
parents:
37565
diff
changeset
|
543 GNU Checker, which helps find such problems. |
c4354368031e
Add hints for running Emacs with malloc debuggers.
Eli Zaretskii <eliz@gnu.org>
parents:
37565
diff
changeset
|
544 |
c4354368031e
Add hints for running Emacs with malloc debuggers.
Eli Zaretskii <eliz@gnu.org>
parents:
37565
diff
changeset
|
545 Emacs compiled with such packages might not run without some hacking, |
c4354368031e
Add hints for running Emacs with malloc debuggers.
Eli Zaretskii <eliz@gnu.org>
parents:
37565
diff
changeset
|
546 because Emacs replaces the system's memory allocation functions with |
c4354368031e
Add hints for running Emacs with malloc debuggers.
Eli Zaretskii <eliz@gnu.org>
parents:
37565
diff
changeset
|
547 its own versions, and because the dumping process might be |
c4354368031e
Add hints for running Emacs with malloc debuggers.
Eli Zaretskii <eliz@gnu.org>
parents:
37565
diff
changeset
|
548 incompatible with the way these packages use to track allocated |
c4354368031e
Add hints for running Emacs with malloc debuggers.
Eli Zaretskii <eliz@gnu.org>
parents:
37565
diff
changeset
|
549 memory. Here are some of the changes you might find necessary |
c4354368031e
Add hints for running Emacs with malloc debuggers.
Eli Zaretskii <eliz@gnu.org>
parents:
37565
diff
changeset
|
550 (SYSTEM-NAME and MACHINE-NAME are the names of your OS- and |
c4354368031e
Add hints for running Emacs with malloc debuggers.
Eli Zaretskii <eliz@gnu.org>
parents:
37565
diff
changeset
|
551 CPU-specific headers in the subdirectories of `src'): |
c4354368031e
Add hints for running Emacs with malloc debuggers.
Eli Zaretskii <eliz@gnu.org>
parents:
37565
diff
changeset
|
552 |
c4354368031e
Add hints for running Emacs with malloc debuggers.
Eli Zaretskii <eliz@gnu.org>
parents:
37565
diff
changeset
|
553 - In src/s/SYSTEM-NAME.h add "#define SYSTEM_MALLOC". |
c4354368031e
Add hints for running Emacs with malloc debuggers.
Eli Zaretskii <eliz@gnu.org>
parents:
37565
diff
changeset
|
554 |
c4354368031e
Add hints for running Emacs with malloc debuggers.
Eli Zaretskii <eliz@gnu.org>
parents:
37565
diff
changeset
|
555 - In src/m/MACHINE-NAME.h add "#define CANNOT_DUMP" and |
c4354368031e
Add hints for running Emacs with malloc debuggers.
Eli Zaretskii <eliz@gnu.org>
parents:
37565
diff
changeset
|
556 "#define CANNOT_UNEXEC". |
c4354368031e
Add hints for running Emacs with malloc debuggers.
Eli Zaretskii <eliz@gnu.org>
parents:
37565
diff
changeset
|
557 |
c4354368031e
Add hints for running Emacs with malloc debuggers.
Eli Zaretskii <eliz@gnu.org>
parents:
37565
diff
changeset
|
558 - Configure with a different --prefix= option. If you use GCC, |
c4354368031e
Add hints for running Emacs with malloc debuggers.
Eli Zaretskii <eliz@gnu.org>
parents:
37565
diff
changeset
|
559 version 2.7.2 is preferred, as some malloc debugging packages |
c4354368031e
Add hints for running Emacs with malloc debuggers.
Eli Zaretskii <eliz@gnu.org>
parents:
37565
diff
changeset
|
560 work a lot better with it than with 2.95 or later versions. |
c4354368031e
Add hints for running Emacs with malloc debuggers.
Eli Zaretskii <eliz@gnu.org>
parents:
37565
diff
changeset
|
561 |
c4354368031e
Add hints for running Emacs with malloc debuggers.
Eli Zaretskii <eliz@gnu.org>
parents:
37565
diff
changeset
|
562 - Type "make" then "make -k install". |
c4354368031e
Add hints for running Emacs with malloc debuggers.
Eli Zaretskii <eliz@gnu.org>
parents:
37565
diff
changeset
|
563 |
c4354368031e
Add hints for running Emacs with malloc debuggers.
Eli Zaretskii <eliz@gnu.org>
parents:
37565
diff
changeset
|
564 - If required, invoke the package-specific command to prepare |
c4354368031e
Add hints for running Emacs with malloc debuggers.
Eli Zaretskii <eliz@gnu.org>
parents:
37565
diff
changeset
|
565 src/temacs for execution. |
c4354368031e
Add hints for running Emacs with malloc debuggers.
Eli Zaretskii <eliz@gnu.org>
parents:
37565
diff
changeset
|
566 |
c4354368031e
Add hints for running Emacs with malloc debuggers.
Eli Zaretskii <eliz@gnu.org>
parents:
37565
diff
changeset
|
567 - cd ..; src/temacs |
c4354368031e
Add hints for running Emacs with malloc debuggers.
Eli Zaretskii <eliz@gnu.org>
parents:
37565
diff
changeset
|
568 |
c4354368031e
Add hints for running Emacs with malloc debuggers.
Eli Zaretskii <eliz@gnu.org>
parents:
37565
diff
changeset
|
569 (Note that this runs `temacs' instead of the usual `emacs' executable. |
c4354368031e
Add hints for running Emacs with malloc debuggers.
Eli Zaretskii <eliz@gnu.org>
parents:
37565
diff
changeset
|
570 This avoids problems with dumping Emacs mentioned above.) |
c4354368031e
Add hints for running Emacs with malloc debuggers.
Eli Zaretskii <eliz@gnu.org>
parents:
37565
diff
changeset
|
571 |
c4354368031e
Add hints for running Emacs with malloc debuggers.
Eli Zaretskii <eliz@gnu.org>
parents:
37565
diff
changeset
|
572 Some malloc debugging libraries might print lots of false alarms for |
c4354368031e
Add hints for running Emacs with malloc debuggers.
Eli Zaretskii <eliz@gnu.org>
parents:
37565
diff
changeset
|
573 bitfields used by Emacs in some data structures. If you want to get |
c4354368031e
Add hints for running Emacs with malloc debuggers.
Eli Zaretskii <eliz@gnu.org>
parents:
37565
diff
changeset
|
574 rid of the false alarms, you will have to hack the definitions of |
c4354368031e
Add hints for running Emacs with malloc debuggers.
Eli Zaretskii <eliz@gnu.org>
parents:
37565
diff
changeset
|
575 these data structures on the respective headers to remove the `:N' |
c4354368031e
Add hints for running Emacs with malloc debuggers.
Eli Zaretskii <eliz@gnu.org>
parents:
37565
diff
changeset
|
576 bitfield definitions (which will cause each such field to use a full |
c4354368031e
Add hints for running Emacs with malloc debuggers.
Eli Zaretskii <eliz@gnu.org>
parents:
37565
diff
changeset
|
577 int). |
c4354368031e
Add hints for running Emacs with malloc debuggers.
Eli Zaretskii <eliz@gnu.org>
parents:
37565
diff
changeset
|
578 |
35655
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
579 ** Some suggestions for debugging on MS Windows: |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
580 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
581 (written by Marc Fleischeuers, Geoff Voelker and Andrew Innes) |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
582 |
35791
7c5f4564ff27
Changes, clean-ups, and typo fixes from Richard Stallman.
Eli Zaretskii <eliz@gnu.org>
parents:
35720
diff
changeset
|
583 To debug Emacs with Microsoft Visual C++, you either start emacs from |
37333
54ec1bffae34
Document problems with MS debugger working on optimized code.
Eli Zaretskii <eliz@gnu.org>
parents:
37157
diff
changeset
|
584 the debugger or attach the debugger to a running emacs process. |
54ec1bffae34
Document problems with MS debugger working on optimized code.
Eli Zaretskii <eliz@gnu.org>
parents:
37157
diff
changeset
|
585 |
54ec1bffae34
Document problems with MS debugger working on optimized code.
Eli Zaretskii <eliz@gnu.org>
parents:
37157
diff
changeset
|
586 To start emacs from the debugger, you can use the file bin/debug.bat. |
54ec1bffae34
Document problems with MS debugger working on optimized code.
Eli Zaretskii <eliz@gnu.org>
parents:
37157
diff
changeset
|
587 The Microsoft Developer studio will start and under Project, Settings, |
35791
7c5f4564ff27
Changes, clean-ups, and typo fixes from Richard Stallman.
Eli Zaretskii <eliz@gnu.org>
parents:
35720
diff
changeset
|
588 Debug, General you can set the command-line arguments and Emacs's |
35655
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
589 startup directory. Set breakpoints (Edit, Breakpoints) at Fsignal and |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
590 other functions that you want to examine. Run the program (Build, |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
591 Start debug). Emacs will start and the debugger will take control as |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
592 soon as a breakpoint is hit. |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
593 |
35791
7c5f4564ff27
Changes, clean-ups, and typo fixes from Richard Stallman.
Eli Zaretskii <eliz@gnu.org>
parents:
35720
diff
changeset
|
594 You can also attach the debugger to an already running Emacs process. |
35655
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
595 To do this, start up the Microsoft Developer studio and select Build, |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
596 Start debug, Attach to process. Choose the Emacs process from the |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
597 list. Send a break to the running process (Debug, Break) and you will |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
598 find that execution is halted somewhere in user32.dll. Open the stack |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
599 trace window and go up the stack to w32_msg_pump. Now you can set |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
600 breakpoints in Emacs (Edit, Breakpoints). Continue the running Emacs |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
601 process (Debug, Step out) and control will return to Emacs, until a |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
602 breakpoint is hit. |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
603 |
35791
7c5f4564ff27
Changes, clean-ups, and typo fixes from Richard Stallman.
Eli Zaretskii <eliz@gnu.org>
parents:
35720
diff
changeset
|
604 To examine the contents of a Lisp variable, you can use the function |
35655
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
605 'debug_print'. Right-click on a variable, select QuickWatch (it has |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
606 an eyeglass symbol on its button in the toolbar), and in the text |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
607 field at the top of the window, place 'debug_print(' and ')' around |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
608 the expression. Press 'Recalculate' and the output is sent to stderr, |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
609 and to the debugger via the OutputDebugString routine. The output |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
610 sent to stderr should be displayed in the console window that was |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
611 opened when the emacs.exe executable was started. The output sent to |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
612 the debugger should be displayed in the 'Debug' pane in the Output |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
613 window. If Emacs was started from the debugger, a console window was |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
614 opened at Emacs' startup; this console window also shows the output of |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
615 'debug_print'. |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
616 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
617 For example, start and run Emacs in the debugger until it is waiting |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
618 for user input. Then click on the `Break' button in the debugger to |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
619 halt execution. Emacs should halt in `ZwUserGetMessage' waiting for |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
620 an input event. Use the `Call Stack' window to select the procedure |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
621 `w32_msp_pump' up the call stack (see below for why you have to do |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
622 this). Open the QuickWatch window and enter |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
623 "debug_print(Vexec_path)". Evaluating this expression will then print |
35791
7c5f4564ff27
Changes, clean-ups, and typo fixes from Richard Stallman.
Eli Zaretskii <eliz@gnu.org>
parents:
35720
diff
changeset
|
624 out the contents of the Lisp variable `exec-path'. |
35655
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
625 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
626 If QuickWatch reports that the symbol is unknown, then check the call |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
627 stack in the `Call Stack' window. If the selected frame in the call |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
628 stack is not an Emacs procedure, then the debugger won't recognize |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
629 Emacs symbols. Instead, select a frame that is inside an Emacs |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
630 procedure and try using `debug_print' again. |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
631 |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
632 If QuickWatch invokes debug_print but nothing happens, then check the |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
633 thread that is selected in the debugger. If the selected thread is |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
634 not the last thread to run (the "current" thread), then it cannot be |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
635 used to execute debug_print. Use the Debug menu to select the current |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
636 thread and try using debug_print again. Note that the debugger halts |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
637 execution (e.g., due to a breakpoint) in the context of the current |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
638 thread, so this should only be a problem if you've explicitly switched |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
639 threads. |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
640 |
35791
7c5f4564ff27
Changes, clean-ups, and typo fixes from Richard Stallman.
Eli Zaretskii <eliz@gnu.org>
parents:
35720
diff
changeset
|
641 It is also possible to keep appropriately masked and typecast Lisp |
35655
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
642 symbols in the Watch window, this is more convenient when steeping |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
643 though the code. For instance, on entering apply_lambda, you can |
c3ac662ac2a3
Expand and update, based on the instructions to
Eli Zaretskii <eliz@gnu.org>
parents:
34594
diff
changeset
|
644 watch (struct Lisp_Symbol *) (0xfffffff & args[0]). |
37333
54ec1bffae34
Document problems with MS debugger working on optimized code.
Eli Zaretskii <eliz@gnu.org>
parents:
37157
diff
changeset
|
645 |
54ec1bffae34
Document problems with MS debugger working on optimized code.
Eli Zaretskii <eliz@gnu.org>
parents:
37157
diff
changeset
|
646 Optimizations often confuse the MS debugger. For example, the |
54ec1bffae34
Document problems with MS debugger working on optimized code.
Eli Zaretskii <eliz@gnu.org>
parents:
37157
diff
changeset
|
647 debugger will sometimes report wrong line numbers, e.g., when it |
54ec1bffae34
Document problems with MS debugger working on optimized code.
Eli Zaretskii <eliz@gnu.org>
parents:
37157
diff
changeset
|
648 prints the backtrace for a crash. It is usually best to look at the |
54ec1bffae34
Document problems with MS debugger working on optimized code.
Eli Zaretskii <eliz@gnu.org>
parents:
37157
diff
changeset
|
649 disassembly to determine exactly what code is being run--the |
54ec1bffae34
Document problems with MS debugger working on optimized code.
Eli Zaretskii <eliz@gnu.org>
parents:
37157
diff
changeset
|
650 disassembly will probably show several source lines followed by a |
54ec1bffae34
Document problems with MS debugger working on optimized code.
Eli Zaretskii <eliz@gnu.org>
parents:
37157
diff
changeset
|
651 block of assembler for those lines. The actual point where Emacs |
54ec1bffae34
Document problems with MS debugger working on optimized code.
Eli Zaretskii <eliz@gnu.org>
parents:
37157
diff
changeset
|
652 crashes will be one of those source lines, but not neccesarily the one |
54ec1bffae34
Document problems with MS debugger working on optimized code.
Eli Zaretskii <eliz@gnu.org>
parents:
37157
diff
changeset
|
653 that the debugger reports. |
54ec1bffae34
Document problems with MS debugger working on optimized code.
Eli Zaretskii <eliz@gnu.org>
parents:
37157
diff
changeset
|
654 |
54ec1bffae34
Document problems with MS debugger working on optimized code.
Eli Zaretskii <eliz@gnu.org>
parents:
37157
diff
changeset
|
655 Another problematic area with the MS debugger is with variables that |
54ec1bffae34
Document problems with MS debugger working on optimized code.
Eli Zaretskii <eliz@gnu.org>
parents:
37157
diff
changeset
|
656 are stored in registers: it will sometimes display wrong values for |
54ec1bffae34
Document problems with MS debugger working on optimized code.
Eli Zaretskii <eliz@gnu.org>
parents:
37157
diff
changeset
|
657 those variables. Usually you will not be able to see any value for a |
54ec1bffae34
Document problems with MS debugger working on optimized code.
Eli Zaretskii <eliz@gnu.org>
parents:
37157
diff
changeset
|
658 register variable, but if it is only being stored in a register |
54ec1bffae34
Document problems with MS debugger working on optimized code.
Eli Zaretskii <eliz@gnu.org>
parents:
37157
diff
changeset
|
659 temporarily, you will see an old value for it. Again, you need to |
54ec1bffae34
Document problems with MS debugger working on optimized code.
Eli Zaretskii <eliz@gnu.org>
parents:
37157
diff
changeset
|
660 look at the disassembly to determine which registers are being used, |
54ec1bffae34
Document problems with MS debugger working on optimized code.
Eli Zaretskii <eliz@gnu.org>
parents:
37157
diff
changeset
|
661 and look at those registers directly, to see the actual current values |
54ec1bffae34
Document problems with MS debugger working on optimized code.
Eli Zaretskii <eliz@gnu.org>
parents:
37157
diff
changeset
|
662 of these variables. |
52401 | 663 |
664 ;;; arch-tag: fbf32980-e35d-481f-8e4c-a2eca2586e6b |