Mercurial > emacs
view etc/DEBUG @ 31384:f6cb7dfe5e7c
(vc-cvs-show-log-entry): New function.
(vc-cvs-stay-local): Allow it to be a hostname regexp
as well.
(vc-cvs-remote-p): Renamed to vc-cvs-stay-local-p. Handle
hostname regexps. Updated all callers.
(vc-cvs-responsible-p): Handle directories as well.
(vc-cvs-could-register): New function.
(vc-cvs-retrieve-snapshot): Parse "cvs update" output, keep file
properties up-to-date.
(vc-cvs-checkout): Do the right thing when the
workfile does not exist.
(vc-cvs-registered): Use new function
vc-cvs-parse-entry to do the actual work.
(vc-cvs-remote-p): Allow FILE to be a directory, too.
(vc-cvs-dir-state): New function.
(vc-cvs-dir-state-heuristic): New function, subroutine of the
above.
(vc-cvs-parse-entry): New function, also to be used in
vc-cvs-registered.
(vc-cvs-checkout): Slight restructuring to make the
control-flow more clear and to avoid running `cvs' twice.
(vc-cvs-workfile-version): Removed comment that this
is not reached. It is.
(vc-cvs-merge): Set state to 'edited after merge.
(vc-cvs-merge-news): Set workfile version to nil if not known.
(vc-cvs-latest-on-branch-p): Recommented. Candidate for removal.
(vc-cvs-checkin): Raise the max-correct status from 0
to 1. Make sure to switch to *vc* before looking for an error
message. Use vc-parse-buffer.
(vc-cvs-create-snapshot): Swap DIR and NAME.
(vc-cvs-retrieve-snapshot): New function (untested).
(vc-cvs-stay-local): Default to t.
(vc-cvs-remote-p): New function and property.
(vc-cvs-state): Stay local only if the above is t.
(vc-handle-cvs): Removed.
(vc-cvs-registered): Don't check vc-handle-cvs -- it should all be
done via vc-handled-backends now.
(vc-cvs-header): Escape Id.
(vc-cvs-state, vc-cvs-fetch-status): Use
with-temp-file. Use the new BUFFER=t argument to vc-do-command.
(vc-cvs-print-log, vc-cvs-diff): Insert in the current buffer.
(vc-cvs-state): Use vc-do-command instead of
vc-simple-command.
(vc-cvs-diff): Remove unused and unsupported argument CMP.
(vc-cvs-registered): Obey vc-handle-cvs.
(vc-cvs-registered): Use with-temp-buffer. Reorder
extraction of fields and call to file-attributes because of a
temporary bug in rcp.el.
(vc-cvs-fetch-status): Use with-current-buffer.
Merge in code
from vc-cvs-hooks.el.
(proto vc-cvs-registered): Require 'vc-cvs instead of
'vc-cvs-hooks. Don't require 'vc anymore.
(vc-cvs-responsible-p): Use expand-file-name instead of concat and
file-directory-p instead of file-exists-p.
(vc-cvs-create-snapshot): New function, replacing
vc-cvs-assign-name.
(vc-cvs-assign-name): Remove.
(vc-cvs-header): New var.
Update Copyright.
(vc-cvs-diff): Remove unused `backend' variable.
(vc-cvs-checkout): Only toggle read-only if the buffer is setup
right.
(tail): Provide vc-cvs.
(vc-cvs-merge-news, vc-cvs-checkout): Removed call to
vc-file-clear-masterprops.
(vc-cvs-state): Typo.
(vc-cvs-merge-news): Return the status code rather than the error
msg.
(vc-cvs-state): Don't overwrite a non-heuristic state
with a heuristic one.
(vc-cvs-merge-news): Just use 'edited for the case with conflicts.
(vc-cvs-checkin): Do a trivial parse to set the state in case of
error. That allows us to get to 'needs-merge even in the
stay-local case. There's still no way to detect 'needs-patch in
such a setup (or to force an update for that matter).
(vc-cvs-logentry-check): Remove, the default works as well.
(vc-cvs-print-log, vc-cvs-diff): Run cvs
asynchronously.
(vc-cvs-stay-local): Renamed from
vc-cvs-simple-toggle. Redocumented.
(vc-cvs-state): If locality is wanted, use vc-cvs-state-heuristic.
(vc-cvs-toggle-read-only): Removed.
(for compiler
warnings).
(vc-cvs-release, vc-cvs-system-release): Remove.
(vc-cvs-use-edit, vc-cvs-simple-toggle): New config variables.
(vc-cvs-dired-state-info): Use `cvs-state' and slightly different
status symbols.
(vc-cvs-parse-status, vc-cvs-state): Move from vc-cvs-hooks.el.
(vc-cvs-toggle-read-only): First cut at a function to allow a
cvs-status-free vc-toggle-read-only.
(vc-cvs-merge-news): Move from cvs-merge-news in vc.el.
(vc-cvs-checkin): Use vc-recompute-state+vc-state instead of
vc-cvs-status. Also set vc-state rather than vc-locking-user.
(vc-cvs-checkout): Modify access rights directly if the user
requested not to use `cvs edit'. And refresh the mode line.
(if
workfile' that got lost when the code was extracted from vc.el.
And merged the tail with the rest of the code (not possible in the
old vc.el where the tail was shared among all backends). And
explicitly set the state to 'edited if `writable' is set.
(vc-cvs-revert,vc-cvs-checkout): References to
`vc-checkout-model' updated to `vc-cvs-update-model'.
(vc-cvs-logentry-check): Function added.
(vc-cvs-revert,vc-cvs-checkout): Function calls to
`vc-checkout-required' updated to `vc-cvs-uses-locking'.
(vc-cvs-admin): Added the query-only option as
required by the vc.el file.
(vc-cvs-annotate-difference): Updated to handle
beginning of annotate buffers correctly.
Rename `vc-uses-locking' to
`vc-checkout-required'. Rename the `locked' state to `reserved'.
(vc-cvs-annotate-difference): Handle possible
millenium problem (merged from mainline).
Split the annotate feature into a BACKEND-specific
part and moved the non-BACKEND stuff to vc.el.
(vc-cvs-latest-on-branch-p): Function added.
(vc-cvs-revert): Merged and adapted "unedit" patch
from main line.
(vc-cvs-diff): Function added.
(vc-cvs-checkout): Function `vc-cvs-checkout' added.
Require vc when compiling.
(vc-cvs-register-switches): Doc fix.
(vc-annotate-color-map, vc-annotate-menu-elements): Fix custom type.
(vc-cvs-print-log, vc-cvs-assign-name, vc-cvs-merge)
(vc-cvs-check-headers, vc-cvs-steal, vc-cvs-revert, vc-cvs-checkin):
New functions (code from vc.el).
(vc-annotate-display-default): Fix interactive spec.
(vc-annotate-time-span): Doc fix.
Moved the annotate functionality from vc.el.
(vc-cvs-admin, vc-cvs-fetch-status): Added from vc.el.
(vc-cvs-system-release):
Renamed from vc-cvs-backend-release.
(vc-cvs-release): Moved from vc.el.
(vc-cvs-backend-release): New function.
(vc-cvs-dired-state-info, vc-cvs-fetch-status): Moved
from vc.el and renamed.
author | Gerd Moellmann <gerd@gnu.org> |
---|---|
date | Mon, 04 Sep 2000 19:48:04 +0000 |
parents | e96ffe544684 |
children | 4881cd839f12 |
line wrap: on
line source
Debugging GNU Emacs Copyright (c) 1985 Richard M. Stallman. Permission is granted to anyone to make or distribute verbatim copies of this document as received, in any medium, provided that the copyright notice and permission notice are preserved, and that the distributor grants the recipient permission for further redistribution as permitted by this notice. Permission is granted to distribute modified versions of this document, or of portions of it, under the above conditions, provided also that they carry prominent notices stating who last changed them. On 4.2 you will probably find that dbx does not work for debugging GNU Emacs. For one thing, dbx does not keep the inferior process's terminal modes separate from its own. For another, dbx does not put the inferior in a separate process group, which makes trouble when an inferior uses interrupt input, which GNU Emacs must do on 4.2. dbx has also been observed to have other problems, such as getting incorrect values for register variables in stack frames other than the innermost one. The Emacs distribution now contains GDB, the new source-level debugger for the GNU system. GDB works for debugging Emacs. GDB currently runs on vaxes under 4.2 and on Sun 2 and Sun 3 systems. ** Some useful techniques `Fsignal' is a very useful place to stop in. All Lisp errors go through there. It is useful, when debugging, to have a guaranteed way to return to the debugger at any time. If you are using interrupt-driven input, which is the default, then Emacs is using RAW mode and the only way you can do it is to store the code for some character into the variable stop_character: 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. Put a breakpoint early in `main', or suspend the Emacs, to get an opportunity to do the set command. If you are using cbreak input (see the Lisp function set-input-mode), then typing Control-g will cause a SIGINT, which will return control to the debugger immediately unless you have done ignore 3 (in dbx) or handle 3 nostop noprint (in gdb) You will note that most of GNU Emacs is written to avoid declaring a local variable in an inner block, even in cases where using one would be the cleanest thing to do. This is because dbx cannot access any of the variables in a function which has even one variable defined in an inner block. A few functions in GNU Emacs do have variables in inner blocks, only because I wrote them before realizing that dbx had this problem and never rewrote them to avoid it. I believe that GDB does not have such a problem. ** Examining Lisp object values. When you have a live process to debug, and it has not encountered a 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 arguments. This calls a subroutine which uses the Lisp printer. If you can't use this command, either because the process can't run a subroutine or because the data is invalid, you can fall back on lower-level commands. Use the `xtype' command to print out the data type of the last data value. Once you know the data type, use the command that corresponds to that type. Here are these commands: 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 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. In general, most of the rest of the contents will be addition Lisp objects which you can examine in turn with the x... commands. ** 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) It is necessary to refer to the file `nmout' to convert numeric addresses into symbols and vice versa. It is useful to be running under a window system. 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. ** Debugging incorrect screen updating. 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 the terminal. The use of the directory `~/' prevents interference 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.