1999-10-03 12:39:42 +00:00
|
|
|
|
Debugging GNU Emacs
|
2007-02-11 01:18:25 +00:00
|
|
|
|
|
2016-01-01 09:16:19 +00:00
|
|
|
|
Copyright (C) 1985, 2000-2016 Free Software Foundation, Inc.
|
2007-02-11 01:18:25 +00:00
|
|
|
|
See the end of the file for license conditions.
|
1999-10-03 12:39:42 +00:00
|
|
|
|
|
2015-12-05 10:52:54 +00:00
|
|
|
|
** Preliminaries
|
1999-10-03 12:39:42 +00:00
|
|
|
|
|
2015-12-05 10:52:54 +00:00
|
|
|
|
This section can be skipped if you are already familiar with building
|
|
|
|
|
Emacs with debug info, configuring and starting GDB, and simple GDB
|
|
|
|
|
debugging techniques.
|
2001-01-27 19:18:02 +00:00
|
|
|
|
|
2015-12-05 10:52:54 +00:00
|
|
|
|
*** Configuring Emacs for debugging
|
|
|
|
|
|
|
|
|
|
It is best to configure and build Emacs with special options that will
|
|
|
|
|
make the debugging easier. Here's the configure-time options we
|
|
|
|
|
recommend (they are in addition to any other options you might need,
|
|
|
|
|
such as --prefix):
|
|
|
|
|
|
|
|
|
|
CFLAGS='-O0 -g3' ./configure --enable-checking='yes,glyphs' --enable-check-lisp-object-type
|
|
|
|
|
|
|
|
|
|
The CFLAGS value is important: debugging optimized code can be very
|
|
|
|
|
hard. (If the problem only happens with optimized code, you may need
|
|
|
|
|
to enable optimizations. If that happens, try using -Og first,
|
|
|
|
|
instead of -O2, as the former will disable some optimizations that
|
|
|
|
|
make debugging some code exceptionally hard.)
|
|
|
|
|
|
|
|
|
|
Modern versions of GCC support more elaborate debug info that is
|
|
|
|
|
available by just using the -g3 compiler switch. Try using -gdwarf-4
|
|
|
|
|
in addition to -g3, and if that fails, try -gdwarf-3. This is
|
|
|
|
|
especially important if you have to debug optimized code. More info
|
|
|
|
|
about this is available below; search for "analyze failed assertions".
|
|
|
|
|
|
|
|
|
|
The 2 --enable-* switches are optional. They don't have any effect on
|
|
|
|
|
debugging with GDB, but will compile additional code that might catch
|
|
|
|
|
the problem you are debugging much earlier, in the form of assertion
|
|
|
|
|
violation. The --enable-checking option also enables additional
|
|
|
|
|
functionality useful for debugging display problems; see more about
|
|
|
|
|
this below under "Debugging Emacs redisplay problems".
|
|
|
|
|
|
|
|
|
|
Emacs needs not be installed to be debugged, you can debug the binary
|
|
|
|
|
created in the 'src' directory.
|
|
|
|
|
|
|
|
|
|
*** Configuring GDB
|
|
|
|
|
|
|
|
|
|
When you debug Emacs with GDB, you should start GDB in the directory
|
2014-07-26 13:40:53 +00:00
|
|
|
|
where the Emacs executable was made (the 'src' directory in the Emacs
|
|
|
|
|
source tree). That directory has a .gdbinit file that defines various
|
2013-02-22 09:22:21 +00:00
|
|
|
|
"user-defined" commands for debugging Emacs. (These commands are
|
|
|
|
|
described below under "Examining Lisp object values" and "Debugging
|
|
|
|
|
Emacs Redisplay problems".)
|
|
|
|
|
|
2015-12-05 10:52:54 +00:00
|
|
|
|
Starting the debugger from Emacs, via the "M-x gdb" command (described
|
|
|
|
|
below), when the current buffer visits one of the Emacs C source files
|
|
|
|
|
will automatically start GDB in the 'src' directory.
|
|
|
|
|
|
2013-02-22 09:22:21 +00:00
|
|
|
|
Some GDB versions by default do not automatically load .gdbinit files
|
|
|
|
|
in the directory where you invoke GDB. With those versions of GDB,
|
|
|
|
|
you will see a warning when GDB starts, like this:
|
|
|
|
|
|
|
|
|
|
warning: File ".../src/.gdbinit" auto-loading has been declined by your `auto-load safe-path' set to "$debugdir:$datadir/auto-load".
|
|
|
|
|
|
2015-12-05 10:52:54 +00:00
|
|
|
|
The simplest way to fix this is to add the following line to your
|
|
|
|
|
~/.gdbinit file:
|
|
|
|
|
|
|
|
|
|
add-auto-load-safe-path /path/to/emacs/src/.gdbinit
|
|
|
|
|
|
|
|
|
|
There are other ways to overcome that difficulty, they are all
|
|
|
|
|
described in the node "Auto-loading safe path" in the GDB user manual.
|
|
|
|
|
If nothing else helps, type "source /path/to/.gdbinit RET" at the GDB
|
|
|
|
|
prompt, to unconditionally load the GDB init file.
|
|
|
|
|
|
|
|
|
|
*** Use the Emacs GDB UI front-end
|
|
|
|
|
|
|
|
|
|
We recommend using the GUI front-end for GDB provided by Emacs. With
|
2016-03-11 15:54:40 +00:00
|
|
|
|
it, you can start GDB by typing "M-x gdb RET". This will suggest the
|
2016-03-12 08:32:16 +00:00
|
|
|
|
file name of the default binary to debug; if the suggested default is
|
|
|
|
|
not the Emacs binary you want to debug, change the file name as
|
|
|
|
|
needed. Alternatively, if you want to attach the debugger to an
|
|
|
|
|
already running Emacs process, change the GDB command shown in the
|
|
|
|
|
minibuffer to say this:
|
2015-12-05 10:52:54 +00:00
|
|
|
|
|
|
|
|
|
gdb -i=mi -p PID
|
|
|
|
|
|
|
|
|
|
where PID is the numerical process ID of the running Emacs process,
|
|
|
|
|
displayed by system utilities such as 'top' or 'ps' on Posix hosts and
|
|
|
|
|
Task Manager on MS-Windows.
|
|
|
|
|
|
|
|
|
|
Once the debugger starts, open the additional windows provided by the
|
|
|
|
|
GDB UI, by typing "M-x gdb-many-windows RET". (Alternatively, click
|
|
|
|
|
Gud->GDB-MI->Display Other Windows" from the menu bar.) At this
|
|
|
|
|
point, make your frame large enough (or full-screen) such that the
|
|
|
|
|
windows you just opened have enough space to show the content without
|
|
|
|
|
horizontal scrolling.
|
|
|
|
|
|
|
|
|
|
You can later restore your window configuration with the companion
|
|
|
|
|
command "M-x gdb-restore-windows RET", or by deselecting "Display
|
|
|
|
|
Other Windows" from the menu bar.
|
|
|
|
|
|
|
|
|
|
*** Setting initial breakpoints
|
|
|
|
|
|
|
|
|
|
Before you let Emacs run, you should now set breakpoints in the code
|
|
|
|
|
which you want to debug, so that Emacs stops there and lets GDB take
|
|
|
|
|
control. If the code which you want to debug is executed under some
|
|
|
|
|
rare conditions, or only when a certain Emacs command is manually
|
|
|
|
|
invoked, then just set your breakpoint there, let Emacs run, and
|
|
|
|
|
trigger the breakpoint by invoking that command or reproducing those
|
|
|
|
|
rare conditions.
|
|
|
|
|
|
|
|
|
|
If you are less lucky, and the code in question is run very
|
|
|
|
|
frequently, you will have to find some way of avoiding triggering your
|
|
|
|
|
breakpoint when the conditions for the buggy behavior did not yet
|
|
|
|
|
happen. There's no single recipe for this, you will have to be
|
|
|
|
|
creative and study the code to see what's appropriate. Some useful
|
|
|
|
|
tricks for that:
|
|
|
|
|
|
|
|
|
|
. Make your breakpoint conditional on certain buffer or string
|
|
|
|
|
position. For example:
|
|
|
|
|
|
|
|
|
|
(gdb) break foo.c:1234 if PT >= 9876
|
|
|
|
|
|
|
|
|
|
. Set a break point in some rarely called function, then create the
|
|
|
|
|
conditions for the bug, call that rare function, and when GDB gets
|
|
|
|
|
control, set the breakpoint in the buggy code, knowing that it
|
|
|
|
|
will now be called when the bug happens.
|
|
|
|
|
|
|
|
|
|
. If the bug manifests itself as an error message, set a breakpoint
|
|
|
|
|
in Fsignal, and when it breaks, look at the backtrace to see what
|
|
|
|
|
triggers the error.
|
|
|
|
|
|
|
|
|
|
Some additional techniques are described below under "Getting control
|
|
|
|
|
to the debugger".
|
|
|
|
|
|
|
|
|
|
You are now ready to start your debugging session.
|
|
|
|
|
|
|
|
|
|
If you are starting a new Emacs session, type "run", followed by any
|
|
|
|
|
command-line arguments (e.g., "-Q") into the *gud-emacs* buffer and
|
|
|
|
|
press RET.
|
|
|
|
|
|
|
|
|
|
If you attached the debugger to a running Emacs, type "continue" into
|
|
|
|
|
the *gud-emacs* buffer and press RET.
|
|
|
|
|
|
|
|
|
|
Many variables you will encounter while debugging are Lisp objects.
|
|
|
|
|
These are displayed as integer values (or structures, if you used the
|
|
|
|
|
"--enable-check-lisp-object-type" option at configure time) that are
|
|
|
|
|
hard to interpret, especially if they represent long lists. You can
|
2015-12-07 16:32:00 +00:00
|
|
|
|
use the 'pp' command to display them in their Lisp form. That command
|
|
|
|
|
displays its output on the standard error stream (on GNU/Linux, you
|
|
|
|
|
can redirect that to a file using "M-x redirect-debugging-output").
|
|
|
|
|
This means that if you attach GDB to a running Emacs that was invoked
|
|
|
|
|
from a desktop icon, chances are you will not see the output at all,
|
|
|
|
|
or it will wind up in an obscure place (check the documentation of
|
|
|
|
|
your desktop environment).
|
|
|
|
|
|
|
|
|
|
Additional information about displaying Lisp objects can be found
|
|
|
|
|
under "Examining Lisp object values" below.
|
2015-12-05 10:52:54 +00:00
|
|
|
|
|
|
|
|
|
The rest of this document describes specific useful techniques for
|
|
|
|
|
debugging Emacs; we suggest reading it in its entirety the first time
|
|
|
|
|
you are about to debug Emacs, then look up your specific issues
|
|
|
|
|
whenever you need.
|
|
|
|
|
|
|
|
|
|
Good luck!
|
2013-02-22 09:22:21 +00:00
|
|
|
|
|
|
|
|
|
** When you are trying to analyze failed assertions or backtraces, it
|
2013-06-13 17:04:08 +00:00
|
|
|
|
is essential to compile Emacs with flags suitable for debugging.
|
|
|
|
|
With GCC 4.8 or later, you can invoke 'make' with CFLAGS="-Og -g3".
|
2013-06-18 17:15:25 +00:00
|
|
|
|
With older GCC or non-GCC compilers, you can use CFLAGS="-O0 -g3".
|
2013-06-13 17:52:21 +00:00
|
|
|
|
With GCC and higher optimization levels such as -O2, the
|
|
|
|
|
-fno-omit-frame-pointer and -fno-crossjumping options are often
|
|
|
|
|
essential. The latter prevents GCC from using the same abort call for
|
|
|
|
|
all assertions in a given function, rendering the stack backtrace
|
|
|
|
|
useless for identifying the specific failed assertion.
|
2015-06-05 10:45:02 +00:00
|
|
|
|
Some versions of GCC support recent versions of the DWARF standard for
|
|
|
|
|
debugging info, but default to older versions; for example, they could
|
|
|
|
|
support -gdwarf-4 compiler option (for DWARF v4), but default to
|
|
|
|
|
version 2 of the DWARF standard. For best results in debugging
|
|
|
|
|
abilities, find out the highest version of DWARF your GCC can support,
|
|
|
|
|
and use the corresponding -gdwarf-N switch instead of just -g (you
|
|
|
|
|
will still need -g3, as in "-gdwarf-4 -g3").
|
2005-03-01 16:01:05 +00:00
|
|
|
|
|
2002-02-20 22:24:59 +00:00
|
|
|
|
** It is a good idea to run Emacs under GDB (or some other suitable
|
2001-01-27 19:18:02 +00:00
|
|
|
|
debugger) *all the time*. Then, when Emacs crashes, you will be able
|
|
|
|
|
to debug the live process, not just a core dump. (This is especially
|
|
|
|
|
important on systems which don't support core files, and instead print
|
|
|
|
|
just the registers and some stack addresses.)
|
|
|
|
|
|
2002-02-20 22:24:59 +00:00
|
|
|
|
** If Emacs hangs, or seems to be stuck in some infinite loop, typing
|
2001-01-27 19:18:02 +00:00
|
|
|
|
"kill -TSTP PID", where PID is the Emacs process ID, will cause GDB to
|
|
|
|
|
kick in, provided that you run under GDB.
|
|
|
|
|
|
|
|
|
|
** Getting control to the debugger
|
1999-10-03 12:39:42 +00:00
|
|
|
|
|
2015-08-26 21:05:43 +00:00
|
|
|
|
'Fsignal' is a very useful place to put a breakpoint in. All Lisp
|
2015-06-05 16:54:33 +00:00
|
|
|
|
errors go through there. If you are only interested in errors that
|
2015-08-26 21:05:43 +00:00
|
|
|
|
would fire the debugger, breaking at 'maybe_call_debugger' is useful.
|
1999-10-03 12:39:42 +00:00
|
|
|
|
|
2001-01-31 17:34:45 +00:00
|
|
|
|
It is useful, when debugging, to have a guaranteed way to return to
|
2002-04-24 16:57:19 +00:00
|
|
|
|
the debugger at any time. When using X, this is easy: type C-z at the
|
2001-01-31 17:34:45 +00:00
|
|
|
|
window where Emacs is running under GDB, and it will stop Emacs just
|
|
|
|
|
as it would stop any ordinary program. When Emacs is running in a
|
|
|
|
|
terminal, things are not so easy.
|
|
|
|
|
|
|
|
|
|
The src/.gdbinit file in the Emacs distribution arranges for SIGINT
|
|
|
|
|
(C-g in Emacs) to be passed to Emacs and not give control back to GDB.
|
|
|
|
|
On modern POSIX systems, you can override that with this command:
|
|
|
|
|
|
2002-02-04 12:50:26 +00:00
|
|
|
|
handle SIGINT stop nopass
|
2001-01-31 17:34:45 +00:00
|
|
|
|
|
2015-08-26 21:05:43 +00:00
|
|
|
|
After this 'handle' command, SIGINT will return control to GDB. If
|
|
|
|
|
you want the C-g to cause a QUIT within Emacs as well, omit the 'nopass'.
|
2001-01-31 17:34:45 +00:00
|
|
|
|
|
2015-08-26 21:05:43 +00:00
|
|
|
|
A technique that can work when 'handle SIGINT' does not is to store
|
2001-01-31 17:34:45 +00:00
|
|
|
|
the code for some character into the variable stop_character. Thus,
|
1999-10-03 12:39:42 +00:00
|
|
|
|
|
|
|
|
|
set stop_character = 29
|
|
|
|
|
|
|
|
|
|
makes Control-] (decimal code 29) the stop character.
|
|
|
|
|
Typing Control-] will cause immediate stop. You cannot
|
|
|
|
|
use the set command until the inferior process has been started.
|
2015-08-26 21:05:43 +00:00
|
|
|
|
Put a breakpoint early in 'main', or suspend the Emacs,
|
1999-10-03 12:39:42 +00:00
|
|
|
|
to get an opportunity to do the set command.
|
|
|
|
|
|
2015-06-05 10:45:02 +00:00
|
|
|
|
Another technique for get control to the debugger is to put a
|
|
|
|
|
breakpoint in some rarely used function. One such convenient function
|
|
|
|
|
is Fredraw_display, which you can invoke at will interactively with
|
|
|
|
|
"M-x redraw-display RET".
|
|
|
|
|
|
2007-05-12 09:38:20 +00:00
|
|
|
|
When Emacs is running in a terminal, it is sometimes useful to use a separate
|
|
|
|
|
terminal for the debug session. This can be done by starting Emacs as usual,
|
2015-08-26 21:05:43 +00:00
|
|
|
|
then attaching to it from gdb with the 'attach' command which is explained in
|
2007-05-12 09:38:20 +00:00
|
|
|
|
the node "Attach" of the GDB manual.
|
2005-01-18 01:01:29 +00:00
|
|
|
|
|
2015-06-05 10:45:02 +00:00
|
|
|
|
On MS-Windows, you can start Emacs in its own separate terminal by
|
|
|
|
|
setting the new-console option before running Emacs under GDB:
|
|
|
|
|
|
|
|
|
|
(gdb) set new-console 1
|
|
|
|
|
(gdb) run
|
|
|
|
|
|
1999-10-03 12:39:42 +00:00
|
|
|
|
** Examining Lisp object values.
|
|
|
|
|
|
|
|
|
|
When you have a live process to debug, and it has not encountered a
|
2015-08-26 21:05:43 +00:00
|
|
|
|
fatal error, you can use the GDB command 'pr'. First print the value
|
|
|
|
|
in the ordinary way, with the 'p' command. Then type 'pr' with no
|
1999-10-03 12:39:42 +00:00
|
|
|
|
arguments. This calls a subroutine which uses the Lisp printer.
|
|
|
|
|
|
2015-08-26 21:05:43 +00:00
|
|
|
|
You can also use 'pp value' to print the emacs value directly.
|
2004-10-04 13:37:01 +00:00
|
|
|
|
|
2015-08-26 21:05:43 +00:00
|
|
|
|
To see the current value of a Lisp Variable, use 'pv variable'.
|
2006-06-23 14:37:10 +00:00
|
|
|
|
|
2015-12-07 16:32:00 +00:00
|
|
|
|
These commands send their output to stderr; if that is closed or
|
|
|
|
|
redirected to some file you don't know, you won't see their output.
|
|
|
|
|
This is particularly so for Emacs invoked on MS-Windows from the
|
|
|
|
|
desktop shortcut. On GNU/Linux, you can use the command
|
|
|
|
|
'redirect-debugging-output' to redirect stderr to a file.
|
|
|
|
|
|
2015-08-26 21:05:43 +00:00
|
|
|
|
Note: It is not a good idea to try 'pr', 'pp', or 'pv' if you know that Emacs
|
2004-10-04 13:37:01 +00:00
|
|
|
|
is in deep trouble: its stack smashed (e.g., if it encountered SIGSEGV
|
2015-08-26 21:05:43 +00:00
|
|
|
|
due to stack overflow), or crucial data structures, such as 'obarray',
|
|
|
|
|
corrupted, etc. In such cases, the Emacs subroutine called by 'pr'
|
2001-01-27 19:18:02 +00:00
|
|
|
|
might make more damage, like overwrite some data that is important for
|
|
|
|
|
debugging the original problem.
|
|
|
|
|
|
2015-08-26 21:05:43 +00:00
|
|
|
|
Also, on some systems it is impossible to use 'pr' if you stopped
|
|
|
|
|
Emacs while it was inside 'select'. This is in fact what happens if
|
2001-01-31 17:34:45 +00:00
|
|
|
|
you stop Emacs while it is waiting. In such a situation, don't try to
|
2015-08-26 21:05:43 +00:00
|
|
|
|
use 'pr'. Instead, use 's' to step out of the system call. Then
|
|
|
|
|
Emacs will be between instructions and capable of handling 'pr'.
|
1999-10-03 12:39:42 +00:00
|
|
|
|
|
2015-08-26 21:05:43 +00:00
|
|
|
|
If you can't use 'pr' command, for whatever reason, you can use the
|
|
|
|
|
'xpr' command to print out the data type and value of the last data
|
2006-06-23 14:37:10 +00:00
|
|
|
|
value, For example:
|
|
|
|
|
|
|
|
|
|
p it->object
|
|
|
|
|
xpr
|
|
|
|
|
|
|
|
|
|
You may also analyze data values using lower-level commands. Use the
|
2015-08-26 21:05:43 +00:00
|
|
|
|
'xtype' command to print out the data type of the last data value.
|
2006-06-23 14:37:10 +00:00
|
|
|
|
Once you know the data type, use the command that corresponds to that
|
|
|
|
|
type. Here are these commands:
|
1999-10-03 12:39:42 +00:00
|
|
|
|
|
|
|
|
|
xint xptr xwindow xmarker xoverlay xmiscfree xintfwd xboolfwd xobjfwd
|
|
|
|
|
xbufobjfwd xkbobjfwd xbuflocal xbuffer xsymbol xstring xvector xframe
|
|
|
|
|
xwinconfig xcompiled xcons xcar xcdr xsubr xprocess xfloat xscrollbar
|
2015-06-05 10:45:02 +00:00
|
|
|
|
xchartable xsubchartable xboolvector xhashtable xlist xcoding
|
|
|
|
|
xcharset xfontset xfont xbytecode
|
1999-10-03 12:39:42 +00:00
|
|
|
|
|
|
|
|
|
Each one of them applies to a certain type or class of types.
|
|
|
|
|
(Some of these types are not visible in Lisp, because they exist only
|
|
|
|
|
internally.)
|
|
|
|
|
|
|
|
|
|
Each x... command prints some information about the value, and
|
|
|
|
|
produces a GDB value (subsequently available in $) through which you
|
|
|
|
|
can get at the rest of the contents.
|
|
|
|
|
|
2001-01-27 19:18:02 +00:00
|
|
|
|
In general, most of the rest of the contents will be additional Lisp
|
1999-10-03 12:39:42 +00:00
|
|
|
|
objects which you can examine in turn with the x... commands.
|
|
|
|
|
|
2001-01-27 19:18:02 +00:00
|
|
|
|
Even with a live process, these x... commands are useful for
|
|
|
|
|
examining the fields in a buffer, window, process, frame or marker.
|
|
|
|
|
Here's an example using concepts explained in the node "Value History"
|
2004-12-15 01:27:48 +00:00
|
|
|
|
of the GDB manual to print values associated with the variable
|
|
|
|
|
called frame. First, use these commands:
|
2001-01-27 19:18:02 +00:00
|
|
|
|
|
2015-06-05 10:45:02 +00:00
|
|
|
|
cd src
|
|
|
|
|
gdb emacs
|
|
|
|
|
b set_frame_buffer_list
|
|
|
|
|
r -q
|
2001-01-27 19:18:02 +00:00
|
|
|
|
|
2005-01-18 01:01:29 +00:00
|
|
|
|
Then Emacs hits the breakpoint:
|
2001-01-27 19:18:02 +00:00
|
|
|
|
|
2015-06-05 10:45:02 +00:00
|
|
|
|
(gdb) p frame
|
|
|
|
|
$1 = 139854428
|
|
|
|
|
(gdb) xpr
|
|
|
|
|
Lisp_Vectorlike
|
|
|
|
|
PVEC_FRAME
|
|
|
|
|
$2 = (struct frame *) 0x8560258
|
|
|
|
|
"emacs@localhost"
|
|
|
|
|
(gdb) p *$
|
|
|
|
|
$3 = {
|
|
|
|
|
size = 1073742931,
|
|
|
|
|
next = 0x85dfe58,
|
|
|
|
|
name = 140615219,
|
|
|
|
|
[...]
|
|
|
|
|
}
|
2001-01-27 19:18:02 +00:00
|
|
|
|
|
2015-12-07 16:32:00 +00:00
|
|
|
|
Now we can use 'pp' to print the frame parameters:
|
2006-06-23 14:37:10 +00:00
|
|
|
|
|
2015-06-05 10:45:02 +00:00
|
|
|
|
(gdb) pp $->param_alist
|
|
|
|
|
((background-mode . light) (display-type . color) [...])
|
2001-01-27 19:18:02 +00:00
|
|
|
|
|
|
|
|
|
The Emacs C code heavily uses macros defined in lisp.h. So suppose
|
|
|
|
|
we want the address of the l-value expression near the bottom of
|
2015-08-26 21:05:43 +00:00
|
|
|
|
'add_command_key' from keyboard.c:
|
2001-01-27 19:18:02 +00:00
|
|
|
|
|
|
|
|
|
XVECTOR (this_command_keys)->contents[this_command_key_count++] = key;
|
|
|
|
|
|
2005-11-05 10:09:27 +00:00
|
|
|
|
XVECTOR is a macro, so GDB only knows about it if Emacs has been compiled with
|
|
|
|
|
preprocessor macro information. GCC provides this if you specify the options
|
2015-08-26 21:05:43 +00:00
|
|
|
|
'-gdwarf-N' (where N is 2 or higher) and '-g3'. In this case, GDB can
|
2015-06-05 10:45:02 +00:00
|
|
|
|
evaluate expressions like "p XVECTOR (this_command_keys)".
|
2001-01-27 19:18:02 +00:00
|
|
|
|
|
2005-11-05 10:09:27 +00:00
|
|
|
|
When this information isn't available, you can use the xvector command in GDB
|
|
|
|
|
to get the same result. Here is how:
|
2001-01-27 19:18:02 +00:00
|
|
|
|
|
2015-06-05 10:45:02 +00:00
|
|
|
|
(gdb) p this_command_keys
|
|
|
|
|
$1 = 1078005760
|
|
|
|
|
(gdb) xvector
|
|
|
|
|
$2 = (struct Lisp_Vector *) 0x411000
|
|
|
|
|
0
|
|
|
|
|
(gdb) p $->contents[this_command_key_count]
|
|
|
|
|
$3 = 1077872640
|
|
|
|
|
(gdb) p &$
|
|
|
|
|
$4 = (int *) 0x411008
|
2001-01-27 19:18:02 +00:00
|
|
|
|
|
2015-08-26 21:05:43 +00:00
|
|
|
|
Here's a related example of macros and the GDB 'define' command.
|
|
|
|
|
There are many Lisp vectors such as 'recent_keys', which contains the
|
2008-10-11 18:35:15 +00:00
|
|
|
|
last 300 keystrokes. We can print this Lisp vector
|
2001-01-27 19:18:02 +00:00
|
|
|
|
|
2015-06-05 10:45:02 +00:00
|
|
|
|
p recent_keys
|
|
|
|
|
pr
|
2001-01-27 19:18:02 +00:00
|
|
|
|
|
2015-08-26 21:05:43 +00:00
|
|
|
|
But this may be inconvenient, since 'recent_keys' is much more verbose
|
|
|
|
|
than 'C-h l'. We might want to print only the last 10 elements of
|
|
|
|
|
this vector. 'recent_keys' is updated in keyboard.c by the command
|
2001-01-27 19:18:02 +00:00
|
|
|
|
|
|
|
|
|
XVECTOR (recent_keys)->contents[recent_keys_index] = c;
|
|
|
|
|
|
2015-08-26 21:05:43 +00:00
|
|
|
|
So we define a GDB command 'xvector-elts', so the last 10 keystrokes
|
2003-02-04 14:56:31 +00:00
|
|
|
|
are printed by
|
2001-01-27 19:18:02 +00:00
|
|
|
|
|
2015-06-05 10:45:02 +00:00
|
|
|
|
xvector-elts recent_keys recent_keys_index 10
|
2001-01-27 19:18:02 +00:00
|
|
|
|
|
|
|
|
|
where you can define xvector-elts as follows:
|
|
|
|
|
|
2015-06-05 10:45:02 +00:00
|
|
|
|
define xvector-elts
|
|
|
|
|
set $i = 0
|
|
|
|
|
p $arg0
|
|
|
|
|
xvector
|
|
|
|
|
set $foo = $
|
|
|
|
|
while $i < $arg2
|
|
|
|
|
p $foo->contents[$arg1-($i++)]
|
|
|
|
|
pr
|
|
|
|
|
end
|
|
|
|
|
document xvector-elts
|
|
|
|
|
Prints a range of elements of a Lisp vector.
|
|
|
|
|
xvector-elts v n i
|
2015-08-26 21:05:43 +00:00
|
|
|
|
prints 'i' elements of the vector 'v' ending at the index 'n'.
|
2015-06-05 10:45:02 +00:00
|
|
|
|
end
|
2001-01-27 19:18:02 +00:00
|
|
|
|
|
|
|
|
|
** Getting Lisp-level backtrace information within GDB
|
|
|
|
|
|
2015-08-26 21:05:43 +00:00
|
|
|
|
The most convenient way is to use the 'xbacktrace' command. This
|
2001-01-31 17:34:45 +00:00
|
|
|
|
shows the names of the Lisp functions that are currently active.
|
2001-01-27 19:18:02 +00:00
|
|
|
|
|
2015-08-26 21:05:43 +00:00
|
|
|
|
If that doesn't work (e.g., because the 'backtrace_list' structure is
|
2001-01-27 19:18:02 +00:00
|
|
|
|
corrupted), type "bt" at the GDB prompt, to produce the C-level
|
|
|
|
|
backtrace, and look for stack frames that call Ffuncall. Select them
|
|
|
|
|
one by one in GDB, by typing "up N", where N is the appropriate number
|
|
|
|
|
of frames to go up, and in each frame that calls Ffuncall type this:
|
|
|
|
|
|
|
|
|
|
p *args
|
|
|
|
|
pr
|
|
|
|
|
|
|
|
|
|
This will print the name of the Lisp function called by that level
|
|
|
|
|
of function calling.
|
|
|
|
|
|
|
|
|
|
By printing the remaining elements of args, you can see the argument
|
|
|
|
|
values. Here's how to print the first argument:
|
2003-02-04 14:56:31 +00:00
|
|
|
|
|
2001-01-27 19:18:02 +00:00
|
|
|
|
p args[1]
|
|
|
|
|
pr
|
|
|
|
|
|
|
|
|
|
If you do not have a live process, you can use xtype and the other
|
|
|
|
|
x... commands such as xsymbol to get such information, albeit less
|
|
|
|
|
conveniently. For example:
|
|
|
|
|
|
|
|
|
|
p *args
|
|
|
|
|
xtype
|
|
|
|
|
|
|
|
|
|
and, assuming that "xtype" says that args[0] is a symbol:
|
|
|
|
|
|
2003-02-04 14:56:31 +00:00
|
|
|
|
xsymbol
|
2001-01-27 19:18:02 +00:00
|
|
|
|
|
2015-06-05 10:45:02 +00:00
|
|
|
|
** Debugging Emacs redisplay problems
|
|
|
|
|
|
|
|
|
|
If you configured Emacs with --enable-checking='glyphs', you can use redisplay
|
|
|
|
|
tracing facilities from a running Emacs session.
|
|
|
|
|
|
|
|
|
|
The command "M-x trace-redisplay RET" will produce a trace of what redisplay
|
|
|
|
|
does on the standard error stream. This is very useful for understanding the
|
|
|
|
|
code paths taken by the display engine under various conditions, especially if
|
|
|
|
|
some redisplay optimizations produce wrong results. (You know that redisplay
|
|
|
|
|
optimizations might be involved if "M-x redraw-display RET", or even just
|
|
|
|
|
typing "M-x", causes Emacs to correct the bad display.) Since the cursor
|
|
|
|
|
blinking feature triggers periodic redisplay cycles, we recommend disabling
|
2015-08-26 21:05:43 +00:00
|
|
|
|
'blink-cursor-mode' before invoking 'trace-redisplay', so that you have less
|
2015-06-05 10:45:02 +00:00
|
|
|
|
clutter in the trace. You can also have up to 30 last trace messages dumped to
|
2015-08-26 21:05:43 +00:00
|
|
|
|
standard error by invoking the 'dump-redisplay-history' command.
|
2015-06-05 10:45:02 +00:00
|
|
|
|
|
|
|
|
|
To find the code paths which were taken by the display engine, search xdisp.c
|
|
|
|
|
for the trace messages you see.
|
|
|
|
|
|
2015-08-26 21:05:43 +00:00
|
|
|
|
The command 'dump-glyph-matrix' is useful for producing on standard error
|
2015-06-05 10:45:02 +00:00
|
|
|
|
stream a full dump of the selected window's glyph matrix. See the function's
|
|
|
|
|
doc string for more details. If you are debugging redisplay issues in
|
2015-08-26 21:05:43 +00:00
|
|
|
|
text-mode frames, you may find the command 'dump-frame-glyph-matrix' useful.
|
2015-06-05 10:45:02 +00:00
|
|
|
|
|
2015-08-26 21:05:43 +00:00
|
|
|
|
Other commands useful for debugging redisplay are 'dump-glyph-row' and
|
|
|
|
|
'dump-tool-bar-row'.
|
2015-06-05 10:45:02 +00:00
|
|
|
|
|
|
|
|
|
If you run Emacs under GDB, you can print the contents of any glyph matrix by
|
|
|
|
|
just calling that function with the matrix as its argument. For example, the
|
|
|
|
|
following command will print the contents of the current matrix of the window
|
2015-08-26 21:05:43 +00:00
|
|
|
|
whose pointer is in 'w':
|
2015-06-05 10:45:02 +00:00
|
|
|
|
|
|
|
|
|
(gdb) p dump_glyph_matrix (w->current_matrix, 2)
|
|
|
|
|
|
|
|
|
|
(The second argument 2 tells dump_glyph_matrix to print the glyphs in
|
|
|
|
|
a long form.)
|
|
|
|
|
|
|
|
|
|
The Emacs display code includes special debugging code, but it is normally
|
|
|
|
|
disabled. Configuring Emacs with --enable-checking='yes,glyphs' enables it.
|
|
|
|
|
|
|
|
|
|
Building Emacs like that activates many assertions which scrutinize
|
|
|
|
|
display code operation more than Emacs does normally. (To see the
|
2015-08-26 21:05:43 +00:00
|
|
|
|
code which tests these assertions, look for calls to the 'eassert'
|
2015-06-05 10:45:02 +00:00
|
|
|
|
macros.) Any assertion that is reported to fail should be investigated.
|
|
|
|
|
|
|
|
|
|
When you debug display problems running emacs under X, you can use
|
2015-08-26 21:05:43 +00:00
|
|
|
|
the 'ff' command to flush all pending display updates to the screen.
|
2006-06-23 14:37:10 +00:00
|
|
|
|
|
|
|
|
|
The src/.gdbinit file defines many useful commands for dumping redisplay
|
|
|
|
|
related data structures in a terse and user-friendly format:
|
|
|
|
|
|
2015-08-26 21:05:43 +00:00
|
|
|
|
'ppt' prints value of PT, narrowing, and gap in current buffer.
|
|
|
|
|
'pit' dumps the current display iterator 'it'.
|
|
|
|
|
'pwin' dumps the current window 'win'.
|
|
|
|
|
'prow' dumps the current glyph_row 'row'.
|
|
|
|
|
'pg' dumps the current glyph 'glyph'.
|
|
|
|
|
'pgi' dumps the next glyph.
|
|
|
|
|
'pgrow' dumps all glyphs in current glyph_row 'row'.
|
|
|
|
|
'pcursor' dumps current output_cursor.
|
2006-06-23 14:37:10 +00:00
|
|
|
|
|
2015-08-26 21:05:43 +00:00
|
|
|
|
The above commands also exist in a version with an 'x' suffix which takes an
|
|
|
|
|
object of the relevant type as argument. For example, 'pgrowx' dumps all
|
|
|
|
|
glyphs in its argument, which must be of type 'struct glyph_row'.
|
2015-06-05 10:45:02 +00:00
|
|
|
|
|
|
|
|
|
Since redisplay is performed by Emacs very frequently, you need to place your
|
|
|
|
|
breakpoints cleverly to avoid hitting them all the time, when the issue you are
|
|
|
|
|
debugging did not (yet) happen. Here are some useful techniques for that:
|
|
|
|
|
|
2015-08-26 21:05:43 +00:00
|
|
|
|
. Put a breakpoint at 'Fredraw_display' before running Emacs. Then do
|
2015-06-05 10:45:02 +00:00
|
|
|
|
whatever is required to reproduce the bad display, and invoke "M-x
|
|
|
|
|
redraw-display". The debugger will kick in, and you can set or enable
|
|
|
|
|
breakpoints in strategic places, knowing that the bad display will be
|
|
|
|
|
redrawn from scratch.
|
|
|
|
|
|
|
|
|
|
. For debugging incorrect cursor position, a good place to put a breakpoint is
|
2015-08-26 21:05:43 +00:00
|
|
|
|
in 'set_cursor_from_row'. The first time this function is called as part of
|
|
|
|
|
'redraw-display', Emacs is redrawing the minibuffer window, which is usually
|
2015-06-05 10:45:02 +00:00
|
|
|
|
not what you want; type "continue" to get to the call you want. In general,
|
2015-08-26 21:05:43 +00:00
|
|
|
|
always make sure 'set_cursor_from_row' is called for the right window and
|
2015-06-05 10:45:02 +00:00
|
|
|
|
buffer by examining the value of w->contents: it should be the buffer whose
|
|
|
|
|
display you are debugging.
|
|
|
|
|
|
2015-08-26 21:05:43 +00:00
|
|
|
|
. 'set_cursor_from_row' is also a good place to look at the contents of a
|
|
|
|
|
screen line (a.k.a. "glyph row"), by means of the 'pgrow' GDB command. Of
|
2015-06-05 10:45:02 +00:00
|
|
|
|
course, you need first to make sure the cursor is on the screen line which
|
2015-08-26 21:05:43 +00:00
|
|
|
|
you want to investigate. If you have set a breakpoint in 'Fredraw_display',
|
|
|
|
|
as advised above, move cursor to that line before invoking 'redraw-display'.
|
2015-06-05 10:45:02 +00:00
|
|
|
|
|
|
|
|
|
. If the problem happens only at some specific buffer position or for some
|
|
|
|
|
specific rarely-used character, you can make your breakpoints conditional on
|
|
|
|
|
those values. The display engine maintains the buffer and string position
|
|
|
|
|
it is processing in the it->current member; for example, the buffer
|
|
|
|
|
character position is in it->current.pos.charpos. Most redisplay functions
|
|
|
|
|
accept a pointer to a 'struct it' object as their argument, so you can make
|
|
|
|
|
conditional breakpoints in those functions, like this:
|
|
|
|
|
|
|
|
|
|
(gdb) break x_produce_glyphs if it->current.pos.charpos == 1234
|
|
|
|
|
|
|
|
|
|
For conditioning on the character being displayed, use it->c or
|
|
|
|
|
it->char_to_display.
|
|
|
|
|
|
|
|
|
|
. You can also make the breakpoints conditional on what object is being used
|
|
|
|
|
for producing glyphs for display. The it->method member has the value
|
|
|
|
|
GET_FROM_BUFFER for displaying buffer contents, GET_FROM_STRING for
|
2015-08-26 21:05:43 +00:00
|
|
|
|
displaying a Lisp string (e.g., a 'display' property or an overlay string),
|
|
|
|
|
GET_FROM_IMAGE for displaying an image, etc. See 'enum it_method' in
|
2015-06-05 10:45:02 +00:00
|
|
|
|
dispextern.h for the full list of values.
|
2006-06-23 14:37:10 +00:00
|
|
|
|
|
2006-08-06 00:39:50 +00:00
|
|
|
|
** Following longjmp call.
|
|
|
|
|
|
|
|
|
|
Recent versions of glibc (2.4+?) encrypt stored values for setjmp/longjmp which
|
2015-08-26 21:05:43 +00:00
|
|
|
|
prevents GDB from being able to follow a longjmp call using 'next'. To
|
2006-08-06 00:39:50 +00:00
|
|
|
|
disable this protection you need to set the environment variable
|
|
|
|
|
LD_POINTER_GUARD to 0.
|
|
|
|
|
|
2006-03-14 20:29:15 +00:00
|
|
|
|
** Using GDB in Emacs
|
|
|
|
|
|
|
|
|
|
Debugging with GDB in Emacs offers some advantages over the command line (See
|
|
|
|
|
the GDB Graphical Interface node of the Emacs manual). There are also some
|
|
|
|
|
features available just for debugging Emacs:
|
|
|
|
|
|
2015-12-05 10:52:54 +00:00
|
|
|
|
1) The command gud-print is available on the tool bar (the 'p' icon) and
|
2006-06-23 18:14:57 +00:00
|
|
|
|
allows the user to print the s-expression of the variable at point,
|
|
|
|
|
in the GUD buffer.
|
2006-03-14 20:29:15 +00:00
|
|
|
|
|
2015-08-26 21:05:43 +00:00
|
|
|
|
2) Pressing 'p' on a component of a watch expression that is a lisp object
|
2006-03-14 20:29:15 +00:00
|
|
|
|
in the speedbar prints its s-expression in the GUD buffer.
|
|
|
|
|
|
2015-12-05 10:52:54 +00:00
|
|
|
|
3) The STOP button on the tool bar and the Signals->STOP menu-bar menu
|
|
|
|
|
item are adjusted so that they send SIGTSTP instead of the usual
|
|
|
|
|
SIGINT.
|
2006-03-14 20:29:15 +00:00
|
|
|
|
|
|
|
|
|
4) The command gud-pv has the global binding 'C-x C-a C-v' and prints the
|
|
|
|
|
value of the lisp variable at point.
|
|
|
|
|
|
2001-01-27 19:18:02 +00:00
|
|
|
|
** Debugging what happens while preloading and dumping Emacs
|
|
|
|
|
|
2015-08-26 21:05:43 +00:00
|
|
|
|
Debugging 'temacs' is useful when you want to establish whether a
|
|
|
|
|
problem happens in an undumped Emacs. To run 'temacs' under a
|
|
|
|
|
debugger, type "gdb temacs", then start it with 'r -batch -l loadup'.
|
2015-06-05 10:45:02 +00:00
|
|
|
|
|
2015-08-26 21:05:43 +00:00
|
|
|
|
If you need to debug what happens during dumping, start it with 'r -batch -l
|
2015-06-05 10:45:02 +00:00
|
|
|
|
loadup dump' instead. For debugging the bootstrap dumping, use "loadup
|
|
|
|
|
bootstrap" instead of "loadup dump".
|
2001-01-27 19:18:02 +00:00
|
|
|
|
|
|
|
|
|
If temacs actually succeeds when running under GDB in this way, do not
|
|
|
|
|
try to run the dumped Emacs, because it was dumped with the GDB
|
|
|
|
|
breakpoints in it.
|
|
|
|
|
|
|
|
|
|
** If you encounter X protocol errors
|
|
|
|
|
|
2007-03-26 03:28:55 +00:00
|
|
|
|
The X server normally reports protocol errors asynchronously,
|
|
|
|
|
so you find out about them long after the primitive which caused
|
|
|
|
|
the error has returned.
|
|
|
|
|
|
|
|
|
|
To get clear information about the cause of an error, try evaluating
|
|
|
|
|
(x-synchronize t). That puts Emacs into synchronous mode, where each
|
|
|
|
|
Xlib call checks for errors before it returns. This mode is much
|
|
|
|
|
slower, but when you get an error, you will see exactly which call
|
|
|
|
|
really caused the error.
|
2001-01-27 19:18:02 +00:00
|
|
|
|
|
2001-03-23 12:38:16 +00:00
|
|
|
|
You can start Emacs in a synchronous mode by invoking it with the -xrm
|
|
|
|
|
option, like this:
|
|
|
|
|
|
2001-05-02 04:10:31 +00:00
|
|
|
|
emacs -xrm "emacs.synchronous: true"
|
2001-03-23 12:38:16 +00:00
|
|
|
|
|
2015-08-26 21:05:43 +00:00
|
|
|
|
Setting a breakpoint in the function 'x_error_quitter' and looking at
|
2001-03-23 12:38:16 +00:00
|
|
|
|
the backtrace when Emacs stops inside that function will show what
|
|
|
|
|
code causes the X protocol errors.
|
|
|
|
|
|
2001-12-06 12:35:13 +00:00
|
|
|
|
Some bugs related to the X protocol disappear when Emacs runs in a
|
|
|
|
|
synchronous mode. To track down those bugs, we suggest the following
|
|
|
|
|
procedure:
|
|
|
|
|
|
|
|
|
|
- Run Emacs under a debugger and put a breakpoint inside the
|
|
|
|
|
primitive function which, when called from Lisp, triggers the X
|
|
|
|
|
protocol errors. For example, if the errors happen when you
|
2015-08-26 21:05:43 +00:00
|
|
|
|
delete a frame, put a breakpoint inside 'Fdelete_frame'.
|
2001-12-06 12:35:13 +00:00
|
|
|
|
|
|
|
|
|
- When the breakpoint breaks, step through the code, looking for
|
|
|
|
|
calls to X functions (the ones whose names begin with "X" or
|
|
|
|
|
"Xt" or "Xm").
|
|
|
|
|
|
2015-08-26 21:05:43 +00:00
|
|
|
|
- Insert calls to 'XSync' before and after each call to the X
|
2001-12-06 12:35:13 +00:00
|
|
|
|
functions, like this:
|
|
|
|
|
|
|
|
|
|
XSync (f->output_data.x->display_info->display, 0);
|
|
|
|
|
|
2015-08-26 21:05:43 +00:00
|
|
|
|
where 'f' is the pointer to the 'struct frame' of the selected
|
2001-12-06 12:35:13 +00:00
|
|
|
|
frame, normally available via XFRAME (selected_frame). (Most
|
|
|
|
|
functions which call X already have some variable that holds the
|
2015-08-26 21:05:43 +00:00
|
|
|
|
pointer to the frame, perhaps called 'f' or 'sf', so you shouldn't
|
2001-12-06 12:35:13 +00:00
|
|
|
|
need to compute it.)
|
|
|
|
|
|
|
|
|
|
If your debugger can call functions in the program being debugged,
|
2015-08-26 21:05:43 +00:00
|
|
|
|
you should be able to issue the calls to 'XSync' without recompiling
|
2001-12-06 12:35:13 +00:00
|
|
|
|
Emacs. For example, with GDB, just type:
|
|
|
|
|
|
|
|
|
|
call XSync (f->output_data.x->display_info->display, 0)
|
|
|
|
|
|
|
|
|
|
before and immediately after the suspect X calls. If your
|
|
|
|
|
debugger does not support this, you will need to add these pairs
|
|
|
|
|
of calls in the source and rebuild Emacs.
|
|
|
|
|
|
|
|
|
|
Either way, systematically step through the code and issue these
|
|
|
|
|
calls until you find the first X function called by Emacs after
|
2015-08-26 21:05:43 +00:00
|
|
|
|
which a call to 'XSync' winds up in the function
|
|
|
|
|
'x_error_quitter'. The first X function call for which this
|
2001-12-06 12:35:13 +00:00
|
|
|
|
happens is the one that generated the X protocol error.
|
|
|
|
|
|
|
|
|
|
- You should now look around this offending X call and try to figure
|
|
|
|
|
out what is wrong with it.
|
|
|
|
|
|
2003-01-27 19:59:08 +00:00
|
|
|
|
** If Emacs causes errors or memory leaks in your X server
|
|
|
|
|
|
|
|
|
|
You can trace the traffic between Emacs and your X server with a tool
|
|
|
|
|
like xmon, available at ftp://ftp.x.org/contrib/devel_tools/.
|
|
|
|
|
|
|
|
|
|
Xmon can be used to see exactly what Emacs sends when X protocol errors
|
|
|
|
|
happen. If Emacs causes the X server memory usage to increase you can
|
|
|
|
|
use xmon to see what items Emacs creates in the server (windows,
|
|
|
|
|
graphical contexts, pixmaps) and what items Emacs delete. If there
|
|
|
|
|
are consistently more creations than deletions, the type of item
|
|
|
|
|
and the activity you do when the items get created can give a hint where
|
|
|
|
|
to start debugging.
|
|
|
|
|
|
2001-01-27 19:18:02 +00:00
|
|
|
|
** If the symptom of the bug is that Emacs fails to respond
|
|
|
|
|
|
2015-08-26 21:05:43 +00:00
|
|
|
|
Don't assume Emacs is 'hung'--it may instead be in an infinite loop.
|
2001-01-27 19:18:02 +00:00
|
|
|
|
To find out which, make the problem happen under GDB and stop Emacs
|
|
|
|
|
once it is not responding. (If Emacs is using X Windows directly, you
|
2014-10-22 15:19:44 +00:00
|
|
|
|
can stop Emacs by typing C-z at the GDB job. On MS-Windows, run Emacs
|
|
|
|
|
as usual, and then attach GDB to it -- that will usually interrupt
|
|
|
|
|
whatever Emacs is doing and let you perform the steps described
|
|
|
|
|
below.)
|
|
|
|
|
|
2015-08-26 21:05:43 +00:00
|
|
|
|
Then try stepping with 'step'. If Emacs is hung, the 'step' command
|
|
|
|
|
won't return. If it is looping, 'step' will return.
|
2001-01-27 19:18:02 +00:00
|
|
|
|
|
|
|
|
|
If this shows Emacs is hung in a system call, stop it again and
|
|
|
|
|
examine the arguments of the call. If you report the bug, it is very
|
|
|
|
|
important to state exactly where in the source the system call is, and
|
|
|
|
|
what the arguments are.
|
|
|
|
|
|
|
|
|
|
If Emacs is in an infinite loop, try to determine where the loop
|
|
|
|
|
starts and ends. The easiest way to do this is to use the GDB command
|
2015-08-26 21:05:43 +00:00
|
|
|
|
'finish'. Each time you use it, Emacs resumes execution until it
|
|
|
|
|
exits one stack frame. Keep typing 'finish' until it doesn't
|
2001-01-27 19:18:02 +00:00
|
|
|
|
return--that means the infinite loop is in the stack frame which you
|
|
|
|
|
just tried to finish.
|
|
|
|
|
|
2015-08-26 21:05:43 +00:00
|
|
|
|
Stop Emacs again, and use 'finish' repeatedly again until you get back
|
|
|
|
|
to that frame. Then use 'next' to step through that frame. By
|
2001-01-27 19:18:02 +00:00
|
|
|
|
stepping, you will see where the loop starts and ends. Also, examine
|
|
|
|
|
the data being used in the loop and try to determine why the loop does
|
|
|
|
|
not exit when it should.
|
|
|
|
|
|
2014-10-22 15:19:44 +00:00
|
|
|
|
On GNU and Unix systems, you can also trying sending Emacs SIGUSR2,
|
2015-08-26 21:05:43 +00:00
|
|
|
|
which, if 'debug-on-event' has its default value, will cause Emacs to
|
2014-10-22 15:19:44 +00:00
|
|
|
|
attempt to break it out of its current loop and into the Lisp
|
2016-03-12 08:32:16 +00:00
|
|
|
|
debugger. (See the node "Debugging" in the ELisp manual for the
|
|
|
|
|
details about the Lisp debugger.) This feature is useful when a
|
|
|
|
|
C-level debugger is not conveniently available.
|
2011-04-26 11:26:05 +00:00
|
|
|
|
|
2001-01-27 19:18:02 +00:00
|
|
|
|
** If certain operations in Emacs are slower than they used to be, here
|
|
|
|
|
is some advice for how to find out why.
|
|
|
|
|
|
|
|
|
|
Stop Emacs repeatedly during the slow operation, and make a backtrace
|
|
|
|
|
each time. Compare the backtraces looking for a pattern--a specific
|
|
|
|
|
function that shows up more often than you'd expect.
|
|
|
|
|
|
|
|
|
|
If you don't see a pattern in the C backtraces, get some Lisp
|
|
|
|
|
backtrace information by typing "xbacktrace" or by looking at Ffuncall
|
|
|
|
|
frames (see above), and again look for a pattern.
|
|
|
|
|
|
|
|
|
|
When using X, you can stop Emacs at any time by typing C-z at GDB.
|
|
|
|
|
When not using X, you can do this with C-g. On non-Unix platforms,
|
|
|
|
|
such as MS-DOS, you might need to press C-BREAK instead.
|
|
|
|
|
|
1999-10-03 12:39:42 +00:00
|
|
|
|
** If GDB does not run and your debuggers can't load Emacs.
|
|
|
|
|
|
|
|
|
|
On some systems, no debugger can load Emacs with a symbol table,
|
|
|
|
|
perhaps because they all have fixed limits on the number of symbols
|
|
|
|
|
and Emacs exceeds the limits. Here is a method that can be used
|
|
|
|
|
in such an extremity. Do
|
|
|
|
|
|
|
|
|
|
nm -n temacs > nmout
|
|
|
|
|
strip temacs
|
|
|
|
|
adb temacs
|
|
|
|
|
0xd:i
|
|
|
|
|
0xe:i
|
|
|
|
|
14:i
|
|
|
|
|
17:i
|
|
|
|
|
:r -l loadup (or whatever)
|
|
|
|
|
|
2015-08-26 21:05:43 +00:00
|
|
|
|
It is necessary to refer to the file 'nmout' to convert
|
1999-10-03 12:39:42 +00:00
|
|
|
|
numeric addresses into symbols and vice versa.
|
|
|
|
|
|
|
|
|
|
It is useful to be running under a window system.
|
2010-06-30 02:48:54 +00:00
|
|
|
|
Then, if Emacs becomes hopelessly wedged, you can create another
|
|
|
|
|
window to do kill -9 in. kill -ILL is often useful too, since that
|
|
|
|
|
may make Emacs dump core or return to adb.
|
1999-10-03 12:39:42 +00:00
|
|
|
|
|
2015-06-05 10:45:02 +00:00
|
|
|
|
** Debugging incorrect screen updating on a text terminal.
|
1999-10-03 12:39:42 +00:00
|
|
|
|
|
|
|
|
|
To debug Emacs problems that update the screen wrong, it is useful
|
|
|
|
|
to have a record of what input you typed and what Emacs sent to the
|
|
|
|
|
screen. To make these records, do
|
|
|
|
|
|
|
|
|
|
(open-dribble-file "~/.dribble")
|
|
|
|
|
(open-termscript "~/.termscript")
|
|
|
|
|
|
|
|
|
|
The dribble file contains all characters read by Emacs from the
|
|
|
|
|
terminal, and the termscript file contains all characters it sent to
|
2015-08-26 21:05:43 +00:00
|
|
|
|
the terminal. The use of the directory '~/' prevents interference
|
1999-10-03 12:39:42 +00:00
|
|
|
|
with any other user.
|
|
|
|
|
|
|
|
|
|
If you have irreproducible display problems, put those two expressions
|
|
|
|
|
in your ~/.emacs file. When the problem happens, exit the Emacs that
|
|
|
|
|
you were running, kill it, and rename the two files. Then you can start
|
|
|
|
|
another Emacs without clobbering those files, and use it to examine them.
|
2000-12-15 11:41:20 +00:00
|
|
|
|
|
|
|
|
|
An easy way to see if too much text is being redrawn on a terminal is to
|
2015-08-26 21:05:43 +00:00
|
|
|
|
evaluate '(setq inverse-video t)' before you try the operation you think
|
2000-12-15 11:41:20 +00:00
|
|
|
|
will cause too much redrawing. This doesn't refresh the screen, so only
|
|
|
|
|
newly drawn text is in inverse video.
|
2001-01-27 19:18:02 +00:00
|
|
|
|
|
|
|
|
|
** Debugging LessTif
|
|
|
|
|
|
|
|
|
|
If you encounter bugs whereby Emacs built with LessTif grabs all mouse
|
|
|
|
|
and keyboard events, or LessTif menus behave weirdly, it might be
|
2015-08-26 21:05:43 +00:00
|
|
|
|
helpful to set the 'DEBUGSOURCES' and 'DEBUG_FILE' environment
|
2001-01-27 19:18:02 +00:00
|
|
|
|
variables, so that one can see what LessTif was doing at this point.
|
|
|
|
|
For instance
|
2003-02-04 14:56:31 +00:00
|
|
|
|
|
2001-03-07 14:01:03 +00:00
|
|
|
|
export DEBUGSOURCES="RowColumn.c:MenuShell.c:MenuUtil.c"
|
2001-01-27 19:18:02 +00:00
|
|
|
|
export DEBUG_FILE=/usr/tmp/LESSTIF_TRACE
|
2001-01-30 09:57:39 +00:00
|
|
|
|
emacs &
|
2001-01-27 19:18:02 +00:00
|
|
|
|
|
|
|
|
|
causes LessTif to print traces from the three named source files to a
|
2015-08-26 21:05:43 +00:00
|
|
|
|
file in '/usr/tmp' (that file can get pretty large). The above should
|
2001-01-30 09:57:39 +00:00
|
|
|
|
be typed at the shell prompt before invoking Emacs, as shown by the
|
|
|
|
|
last line above.
|
2001-01-27 19:18:02 +00:00
|
|
|
|
|
|
|
|
|
Running GDB from another terminal could also help with such problems.
|
|
|
|
|
You can arrange for GDB to run on one machine, with the Emacs display
|
|
|
|
|
appearing on another. Then, when the bug happens, you can go back to
|
|
|
|
|
the machine where you started GDB and use the debugger from there.
|
|
|
|
|
|
|
|
|
|
** Debugging problems which happen in GC
|
|
|
|
|
|
2015-08-26 21:05:43 +00:00
|
|
|
|
The array 'last_marked' (defined on alloc.c) can be used to display up
|
2001-03-26 18:43:58 +00:00
|
|
|
|
to 500 last objects marked by the garbage collection process.
|
2001-03-30 09:55:24 +00:00
|
|
|
|
Whenever the garbage collector marks a Lisp object, it records the
|
2015-08-26 21:05:43 +00:00
|
|
|
|
pointer to that object in the 'last_marked' array, which is maintained
|
|
|
|
|
as a circular buffer. The variable 'last_marked_index' holds the
|
|
|
|
|
index into the 'last_marked' array one place beyond where the pointer
|
2006-03-18 14:30:37 +00:00
|
|
|
|
to the very last marked object is stored.
|
2001-01-27 19:18:02 +00:00
|
|
|
|
|
|
|
|
|
The single most important goal in debugging GC problems is to find the
|
|
|
|
|
Lisp data structure that got corrupted. This is not easy since GC
|
|
|
|
|
changes the tag bits and relocates strings which make it hard to look
|
2015-08-26 21:05:43 +00:00
|
|
|
|
at Lisp objects with commands such as 'pr'. It is sometimes necessary
|
2001-01-27 19:18:02 +00:00
|
|
|
|
to convert Lisp_Object variables into pointers to C struct's manually.
|
|
|
|
|
|
2015-08-26 21:05:43 +00:00
|
|
|
|
Use the 'last_marked' array and the source to reconstruct the sequence
|
2006-03-18 14:30:37 +00:00
|
|
|
|
that objects were marked. In general, you need to correlate the
|
2015-08-26 21:05:43 +00:00
|
|
|
|
values recorded in the 'last_marked' array with the corresponding
|
2006-03-18 14:30:37 +00:00
|
|
|
|
stack frames in the backtrace, beginning with the innermost frame.
|
2015-08-26 21:05:43 +00:00
|
|
|
|
Some subroutines of 'mark_object' are invoked recursively, others loop
|
2006-03-18 14:30:37 +00:00
|
|
|
|
over portions of the data structure and mark them as they go. By
|
|
|
|
|
looking at the code of those routines and comparing the frames in the
|
2015-08-26 21:05:43 +00:00
|
|
|
|
backtrace with the values in 'last_marked', you will be able to find
|
|
|
|
|
connections between the values in 'last_marked'. E.g., when GC finds
|
2006-03-18 14:30:37 +00:00
|
|
|
|
a cons cell, it recursively marks its car and its cdr. Similar things
|
|
|
|
|
happen with properties of symbols, elements of vectors, etc. Use
|
|
|
|
|
these connections to reconstruct the data structure that was being
|
|
|
|
|
marked, paying special attention to the strings and names of symbols
|
|
|
|
|
that you encounter: these strings and symbol names can be used to grep
|
|
|
|
|
the sources to find out what high-level symbols and global variables
|
|
|
|
|
are involved in the crash.
|
|
|
|
|
|
|
|
|
|
Once you discover the corrupted Lisp object or data structure, grep
|
|
|
|
|
the sources for its uses and try to figure out what could cause the
|
2007-04-13 02:58:17 +00:00
|
|
|
|
corruption. If looking at the sources doesn't help, you could try
|
2006-03-18 14:30:37 +00:00
|
|
|
|
setting a watchpoint on the corrupted data, and see what code modifies
|
|
|
|
|
it in some invalid way. (Obviously, this technique is only useful for
|
|
|
|
|
data that is modified only very rarely.)
|
|
|
|
|
|
|
|
|
|
It is also useful to look at the corrupted object or data structure in
|
|
|
|
|
a fresh Emacs session and compare its contents with a session that you
|
|
|
|
|
are debugging.
|
2001-01-27 19:18:02 +00:00
|
|
|
|
|
2001-04-25 21:45:52 +00:00
|
|
|
|
** Debugging problems with non-ASCII characters
|
|
|
|
|
|
|
|
|
|
If you experience problems which seem to be related to non-ASCII
|
|
|
|
|
characters, such as \201 characters appearing in the buffer or in your
|
|
|
|
|
files, set the variable byte-debug-flag to t. This causes Emacs to do
|
|
|
|
|
some extra checks, such as look for broken relations between byte and
|
|
|
|
|
character positions in buffers and strings; the resulting diagnostics
|
|
|
|
|
might pinpoint the cause of the problem.
|
|
|
|
|
|
2001-10-24 09:50:06 +00:00
|
|
|
|
** Debugging the TTY (non-windowed) version
|
|
|
|
|
|
|
|
|
|
The most convenient method of debugging the character-terminal display
|
|
|
|
|
is to do that on a window system such as X. Begin by starting an
|
|
|
|
|
xterm window, then type these commands inside that window:
|
|
|
|
|
|
|
|
|
|
$ tty
|
|
|
|
|
$ echo $TERM
|
|
|
|
|
|
|
|
|
|
Let's say these commands print "/dev/ttyp4" and "xterm", respectively.
|
|
|
|
|
|
|
|
|
|
Now start Emacs (the normal, windowed-display session, i.e. without
|
2015-08-26 21:05:43 +00:00
|
|
|
|
the '-nw' option), and invoke "M-x gdb RET emacs RET" from there. Now
|
2001-10-24 09:50:06 +00:00
|
|
|
|
type these commands at GDB's prompt:
|
|
|
|
|
|
|
|
|
|
(gdb) set args -nw -t /dev/ttyp4
|
|
|
|
|
(gdb) set environment TERM xterm
|
|
|
|
|
(gdb) run
|
|
|
|
|
|
|
|
|
|
The debugged Emacs should now start in no-window mode with its display
|
|
|
|
|
directed to the xterm window you opened above.
|
|
|
|
|
|
2001-10-26 20:21:57 +00:00
|
|
|
|
Similar arrangement is possible on a character terminal by using the
|
2015-08-26 21:05:43 +00:00
|
|
|
|
'screen' package.
|
2001-10-26 20:21:57 +00:00
|
|
|
|
|
2015-06-05 10:45:02 +00:00
|
|
|
|
On MS-Windows, you can start Emacs in its own separate terminal by
|
|
|
|
|
setting the new-console option before running Emacs under GDB:
|
|
|
|
|
|
|
|
|
|
(gdb) set new-console 1
|
|
|
|
|
(gdb) run
|
|
|
|
|
|
2001-05-06 16:32:53 +00:00
|
|
|
|
** Running Emacs built with malloc debugging packages
|
|
|
|
|
|
|
|
|
|
If Emacs exhibits bugs that seem to be related to use of memory
|
|
|
|
|
allocated off the heap, it might be useful to link Emacs with a
|
|
|
|
|
special debugging library, such as Electric Fence (a.k.a. efence) or
|
|
|
|
|
GNU Checker, which helps find such problems.
|
|
|
|
|
|
|
|
|
|
Emacs compiled with such packages might not run without some hacking,
|
|
|
|
|
because Emacs replaces the system's memory allocation functions with
|
|
|
|
|
its own versions, and because the dumping process might be
|
|
|
|
|
incompatible with the way these packages use to track allocated
|
2010-06-30 02:48:54 +00:00
|
|
|
|
memory. Here are some of the changes you might find necessary:
|
2001-05-06 16:32:53 +00:00
|
|
|
|
|
2010-06-30 02:48:54 +00:00
|
|
|
|
- Edit configure, to set system_malloc and CANNOT_DUMP to "yes".
|
2001-05-06 16:32:53 +00:00
|
|
|
|
|
|
|
|
|
- Configure with a different --prefix= option. If you use GCC,
|
|
|
|
|
version 2.7.2 is preferred, as some malloc debugging packages
|
|
|
|
|
work a lot better with it than with 2.95 or later versions.
|
|
|
|
|
|
|
|
|
|
- Type "make" then "make -k install".
|
|
|
|
|
|
|
|
|
|
- If required, invoke the package-specific command to prepare
|
|
|
|
|
src/temacs for execution.
|
|
|
|
|
|
|
|
|
|
- cd ..; src/temacs
|
|
|
|
|
|
2015-08-26 21:05:43 +00:00
|
|
|
|
(Note that this runs 'temacs' instead of the usual 'emacs' executable.
|
2001-05-06 16:32:53 +00:00
|
|
|
|
This avoids problems with dumping Emacs mentioned above.)
|
|
|
|
|
|
|
|
|
|
Some malloc debugging libraries might print lots of false alarms for
|
|
|
|
|
bitfields used by Emacs in some data structures. If you want to get
|
|
|
|
|
rid of the false alarms, you will have to hack the definitions of
|
2015-08-26 21:05:43 +00:00
|
|
|
|
these data structures on the respective headers to remove the ':N'
|
2001-05-06 16:32:53 +00:00
|
|
|
|
bitfield definitions (which will cause each such field to use a full
|
|
|
|
|
int).
|
|
|
|
|
|
2005-06-11 13:02:39 +00:00
|
|
|
|
** How to recover buffer contents from an Emacs core dump file
|
|
|
|
|
|
|
|
|
|
The file etc/emacs-buffer.gdb defines a set of GDB commands for
|
|
|
|
|
recovering the contents of Emacs buffers from a core dump file. You
|
|
|
|
|
might also find those commands useful for displaying the list of
|
|
|
|
|
buffers in human-readable format from within the debugger.
|
|
|
|
|
|
2007-02-11 01:18:25 +00:00
|
|
|
|
|
|
|
|
|
This file is part of GNU Emacs.
|
|
|
|
|
|
2008-05-15 07:32:14 +00:00
|
|
|
|
GNU Emacs is free software: you can redistribute it and/or modify
|
2007-02-11 01:18:25 +00:00
|
|
|
|
it under the terms of the GNU General Public License as published by
|
2008-05-15 07:32:14 +00:00
|
|
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
|
|
|
(at your option) any later version.
|
2007-02-11 01:18:25 +00:00
|
|
|
|
|
|
|
|
|
GNU Emacs is distributed in the hope that it will be useful,
|
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
2008-05-15 07:32:14 +00:00
|
|
|
|
along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
|
2007-02-11 01:18:25 +00:00
|
|
|
|
|
2006-08-06 00:45:53 +00:00
|
|
|
|
|
|
|
|
|
Local variables:
|
|
|
|
|
mode: outline
|
|
|
|
|
paragraph-separate: "[ ]*$"
|
|
|
|
|
end:
|