;;; debug.el --- debuggers and related commands for Emacs
-;; Copyright (C) 1985, 1986, 1994, 2001, 2002, 2003, 2004,
-;; 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+;; Copyright (C) 1985-1986, 1994, 2001-2011 Free Software Foundation, Inc.
;; Maintainer: FSF
;; Keywords: lisp, tools, maint
:group 'debug)
(defcustom debugger-mode-hook nil
- "*Hooks run when `debugger-mode' is turned on."
+ "Hooks run when `debugger-mode' is turned on."
:type 'hook
:group 'debugger
:version "20.3")
(defcustom debugger-batch-max-lines 40
- "*Maximum lines to show in debugger buffer in a noninteractive Emacs.
+ "Maximum lines to show in debugger buffer in a noninteractive Emacs.
When the debugger is entered and Emacs is running in batch mode,
if the backtrace text has more than this many lines,
the middle is discarded, and just the beginning and end are displayed."
(setq debugger 'debug)
;;;###autoload
(defun debug (&rest debugger-args)
- "Enter debugger. To return, type \\<debugger-mode-map>`\\[debugger-continue]'.
+ "Enter debugger. \\<debugger-mode-map>`\\[debugger-continue]' returns from the debugger.
Arguments are mainly for use when this is called from the internals
of the evaluator.
(let (debugger-value
(debug-on-error nil)
(debug-on-quit nil)
- (debugger-buffer (let ((default-major-mode 'fundamental-mode))
- (get-buffer-create "*Backtrace*")))
+ (debugger-previous-state
+ (if (get-buffer "*Backtrace*")
+ (with-current-buffer (get-buffer "*Backtrace*")
+ (list major-mode (buffer-string)))))
+ (debugger-buffer (get-buffer-create "*Backtrace*"))
(debugger-old-buffer (current-buffer))
(debugger-step-after-exit nil)
(debugger-will-be-back nil)
(insert "...\n"))
(goto-char (point-min))
(message "%s" (buffer-string))
- (kill-emacs))
+ (kill-emacs -1))
(message "")
(let ((standard-output nil)
(buffer-read-only t))
;; recreate it every time the debugger stops, so instead we'll
;; erase it (and maybe hide it) but keep it alive.
(with-current-buffer debugger-buffer
- (erase-buffer)
- (fundamental-mode)
(with-selected-window (get-buffer-window debugger-buffer 0)
(when (and (window-dedicated-p (selected-window))
(not debugger-will-be-back))
;; to be left at the top-level, still working on how
;; best to do that.
(bury-buffer))))
- (kill-buffer debugger-buffer))
+ (unless debugger-previous-state
+ (kill-buffer debugger-buffer)))
+ ;; Restore the previous state of the debugger-buffer, in case we were
+ ;; in a recursive invocation of the debugger.
+ (when (buffer-live-p debugger-buffer)
+ (with-current-buffer debugger-buffer
+ (let ((inhibit-read-only t))
+ (erase-buffer)
+ (if (null debugger-previous-state)
+ (fundamental-mode)
+ (insert (nth 1 debugger-previous-state))
+ (funcall (nth 0 debugger-previous-state))))))
(with-timeout-unsuspend debugger-with-timeout-suspend)
(set-match-data debugger-outer-match-data)))
;; Put into effect the modified values of these variables
That buffer should be current already."
(setq buffer-read-only nil)
(erase-buffer)
- (set-buffer-multibyte nil)
+ (set-buffer-multibyte t) ;Why was it nil ? -stef
(setq buffer-undo-list t)
(let ((standard-output (current-buffer))
(print-escape-newlines t)
(defun debugger-make-xrefs (&optional buffer)
"Attach cross-references to function names in the `*Backtrace*' buffer."
(interactive "b")
- (save-excursion
- (set-buffer (or buffer (current-buffer)))
+ (with-current-buffer (or buffer (current-buffer))
(setq buffer (current-buffer))
(let ((inhibit-read-only t)
(old-end (point-min)) (new-end (point-min)))
(insert ? )))
(beginning-of-line))
-(put 'debugger-env-macro 'lisp-indent-function 0)
(defmacro debugger-env-macro (&rest body)
"Run BODY in original environment."
+ (declare (indent 0))
`(save-excursion
(if (null (buffer-name debugger-old-buffer))
;; old buffer deleted
(run-mode-hooks 'debugger-mode-hook))
\f
(defcustom debugger-record-buffer "*Debugger-record*"
- "*Buffer name for expression values, for \\[debugger-record-expression]."
+ "Buffer name for expression values, for \\[debugger-record-expression]."
:type 'string
:group 'debugger
:version "20.3")
"Display a list of all the functions now set to debug on entry."
(interactive)
(require 'help-mode)
- (help-setup-xref '(debugger-list-functions) (interactive-p))
+ (help-setup-xref '(debugger-list-functions)
+ (called-interactively-p 'interactive))
(with-output-to-temp-buffer (help-buffer)
(with-current-buffer standard-output
(if (null debug-function-list)
(provide 'debug)
-;; arch-tag: b6ec7047-f801-4103-9c63-d69322db9d3b
;;; debug.el ends here