aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Pogonyshev2020-01-26 22:54:32 -0500
committerEli Zaretskii2020-01-31 16:09:42 +0200
commit0223a1577c8999b8ea5eb35f39bc68360cbf5221 (patch)
tree2a165de1f63598fbb5d63a290e1e7b1937a854c1
parent5bf2ef3871b0f42266f6bde7c0d2d607e9625770 (diff)
downloademacs-0223a1577c8999b8ea5eb35f39bc68360cbf5221.tar.gz
emacs-0223a1577c8999b8ea5eb35f39bc68360cbf5221.zip
* lisp/emacs-lisp/debug.el (debug): Merge the non-interactive cases
bug#38927 (cherry picked from commit 502059433ce0e9699eb73d21656ce6e9e127d63b)
-rw-r--r--lisp/emacs-lisp/debug.el292
1 files changed, 142 insertions, 150 deletions
diff --git a/lisp/emacs-lisp/debug.el b/lisp/emacs-lisp/debug.el
index f67aa897283..ed28997292f 100644
--- a/lisp/emacs-lisp/debug.el
+++ b/lisp/emacs-lisp/debug.el
@@ -168,158 +168,150 @@ first will be printed into the backtrace buffer.
168If `inhibit-redisplay' is non-nil when this function is called, 168If `inhibit-redisplay' is non-nil when this function is called,
169the debugger will not be entered." 169the debugger will not be entered."
170 (interactive) 170 (interactive)
171 (cond 171 (if inhibit-redisplay
172 (inhibit-redisplay 172 ;; Don't really try to enter debugger within an eval from redisplay.
173 ;; Don't really try to enter debugger within an eval from redisplay. 173 debugger-value
174 debugger-value) 174 (let ((non-interactive-frame
175 ((and (eq t (framep (selected-frame))) 175 (or noninteractive ;FIXME: Presumably redundant.
176 (equal "initial_terminal" (terminal-name))) 176 ;; If we're in the initial-frame (where `message' just
177 ;; We're in the initial-frame (where `message' just outputs to stdout) so 177 ;; outputs to stdout) so there's no tty or GUI frame to
178 ;; there's no tty or GUI frame to display the backtrace and interact with 178 ;; display the backtrace and interact with it: just dump a
179 ;; it: just dump a backtrace to stdout. 179 ;; backtrace to stdout. This happens for example while
180 ;; This happens for example while handling an error in code from 180 ;; handling an error in code from early-init.el with
181 ;; early-init.el with --debug-init. 181 ;; --debug-init.
182 (message "Error: %S" args) 182 (and (eq t (framep (selected-frame)))
183 (let ((print-escape-newlines t) 183 (equal "initial_terminal" (terminal-name)))))
184 (print-escape-control-characters t) 184 ;; Don't let `inhibit-message' get in our way (especially important if
185 (print-level 8) 185 ;; `non-interactive-frame' evaluated to a non-nil value.
186 (print-length 50) 186 (inhibit-message nil))
187 (skip t)) ;Skip the first frame (i.e. the `debug' frame)! 187 (unless non-interactive-frame
188 (mapbacktrace (lambda (_evald func args _flags) 188 (message "Entering debugger..."))
189 (if skip 189 (let (debugger-value
190 (setq skip nil) 190 (debugger-previous-state
191 (message " %S" (cons func args)))) 191 (if (get-buffer "*Backtrace*")
192 'debug))) 192 (with-current-buffer (get-buffer "*Backtrace*")
193 (t 193 (debugger--save-buffer-state))))
194 (unless noninteractive 194 (debugger-args args)
195 (message "Entering debugger...")) 195 (debugger-buffer (get-buffer-create "*Backtrace*"))
196 (let (debugger-value 196 (debugger-old-buffer (current-buffer))
197 (debugger-previous-state 197 (debugger-window nil)
198 (if (get-buffer "*Backtrace*") 198 (debugger-step-after-exit nil)
199 (with-current-buffer (get-buffer "*Backtrace*") 199 (debugger-will-be-back nil)
200 (debugger--save-buffer-state)))) 200 ;; Don't keep reading from an executing kbd macro!
201 (debugger-args args) 201 (executing-kbd-macro nil)
202 (debugger-buffer (get-buffer-create "*Backtrace*")) 202 ;; Save the outer values of these vars for the `e' command
203 (debugger-old-buffer (current-buffer)) 203 ;; before we replace the values.
204 (debugger-window nil) 204 (debugger-outer-match-data (match-data))
205 (debugger-step-after-exit nil) 205 (debugger-with-timeout-suspend (with-timeout-suspend)))
206 (debugger-will-be-back nil) 206 ;; Set this instead of binding it, so that `q'
207 ;; Don't keep reading from an executing kbd macro! 207 ;; will not restore it.
208 (executing-kbd-macro nil) 208 (setq overriding-terminal-local-map nil)
209 ;; Save the outer values of these vars for the `e' command 209 ;; Don't let these magic variables affect the debugger itself.
210 ;; before we replace the values. 210 (let ((last-command nil) this-command track-mouse
211 (debugger-outer-match-data (match-data)) 211 (inhibit-trace t)
212 (debugger-with-timeout-suspend (with-timeout-suspend))) 212 unread-command-events
213 ;; Set this instead of binding it, so that `q' 213 unread-post-input-method-events
214 ;; will not restore it. 214 last-input-event last-command-event last-nonmenu-event
215 (setq overriding-terminal-local-map nil) 215 last-event-frame
216 ;; Don't let these magic variables affect the debugger itself. 216 overriding-local-map
217 (let ((last-command nil) this-command track-mouse 217 load-read-function
218 (inhibit-trace t) 218 ;; If we are inside a minibuffer, allow nesting
219 unread-command-events 219 ;; so that we don't get an error from the `e' command.
220 unread-post-input-method-events 220 (enable-recursive-minibuffers
221 last-input-event last-command-event last-nonmenu-event 221 (or enable-recursive-minibuffers (> (minibuffer-depth) 0)))
222 last-event-frame 222 (standard-input t) (standard-output t)
223 overriding-local-map 223 inhibit-redisplay
224 load-read-function 224 (cursor-in-echo-area nil)
225 ;; If we are inside a minibuffer, allow nesting 225 (window-configuration (current-window-configuration)))
226 ;; so that we don't get an error from the `e' command. 226 (unwind-protect
227 (enable-recursive-minibuffers 227 (save-excursion
228 (or enable-recursive-minibuffers (> (minibuffer-depth) 0))) 228 (when (eq (car debugger-args) 'debug)
229 (standard-input t) (standard-output t) 229 ;; Skip the frames for backtrace-debug, byte-code,
230 inhibit-redisplay 230 ;; debug--implement-debug-on-entry and the advice's `apply'.
231 (cursor-in-echo-area nil) 231 (backtrace-debug 4 t)
232 (window-configuration (current-window-configuration))) 232 ;; Place an extra debug-on-exit for macro's.
233 (unwind-protect 233 (when (eq 'lambda (car-safe (cadr (backtrace-frame 4))))
234 (save-excursion 234 (backtrace-debug 5 t)))
235 (when (eq (car debugger-args) 'debug) 235 (with-current-buffer debugger-buffer
236 ;; Skip the frames for backtrace-debug, byte-code, 236 (unless (derived-mode-p 'debugger-mode)
237 ;; debug--implement-debug-on-entry and the advice's `apply'. 237 (debugger-mode))
238 (backtrace-debug 4 t) 238 (debugger-setup-buffer debugger-args)
239 ;; Place an extra debug-on-exit for macro's. 239 (when non-interactive-frame
240 (when (eq 'lambda (car-safe (cadr (backtrace-frame 4)))) 240 ;; If the backtrace is long, save the beginning
241 (backtrace-debug 5 t))) 241 ;; and the end, but discard the middle.
242 (with-current-buffer debugger-buffer 242 (let ((inhibit-read-only t))
243 (unless (derived-mode-p 'debugger-mode) 243 (when (> (count-lines (point-min) (point-max))
244 (debugger-mode)) 244 debugger-batch-max-lines)
245 (debugger-setup-buffer debugger-args) 245 (goto-char (point-min))
246 (when noninteractive 246 (forward-line (/ debugger-batch-max-lines 2))
247 ;; If the backtrace is long, save the beginning 247 (let ((middlestart (point)))
248 ;; and the end, but discard the middle. 248 (goto-char (point-max))
249 (when (> (count-lines (point-min) (point-max)) 249 (forward-line (- (/ debugger-batch-max-lines 2)))
250 debugger-batch-max-lines) 250 (delete-region middlestart (point)))
251 (goto-char (point-min)) 251 (insert "...\n")))
252 (forward-line (/ 2 debugger-batch-max-lines)) 252 (message "%s" (buffer-string))
253 (let ((middlestart (point))) 253 (kill-emacs -1)))
254 (goto-char (point-max)) 254 (pop-to-buffer
255 (forward-line (- (/ 2 debugger-batch-max-lines) 255 debugger-buffer
256 debugger-batch-max-lines)) 256 `((display-buffer-reuse-window
257 (delete-region middlestart (point))) 257 display-buffer-in-previous-window
258 (insert "...\n")) 258 display-buffer-below-selected)
259 (goto-char (point-min)) 259 . ((window-min-height . 10)
260 (message "%s" (buffer-string)) 260 (window-height . fit-window-to-buffer)
261 (kill-emacs -1))) 261 ,@(when (and (window-live-p debugger-previous-window)
262 (pop-to-buffer 262 (frame-visible-p
263 debugger-buffer 263 (window-frame debugger-previous-window)))
264 `((display-buffer-reuse-window 264 `((previous-window . ,debugger-previous-window))))))
265 display-buffer-in-previous-window 265 (setq debugger-window (selected-window))
266 display-buffer-below-selected) 266 (if (eq debugger-previous-window debugger-window)
267 . ((window-min-height . 10) 267 (when debugger-jumping-flag
268 (window-height . fit-window-to-buffer) 268 ;; Try to restore previous height of debugger
269 ,@(when (and (window-live-p debugger-previous-window) 269 ;; window.
270 (frame-visible-p 270 (condition-case nil
271 (window-frame debugger-previous-window))) 271 (window-resize
272 `((previous-window . ,debugger-previous-window)))))) 272 debugger-window
273 (setq debugger-window (selected-window)) 273 (- debugger-previous-window-height
274 (if (eq debugger-previous-window debugger-window) 274 (window-total-height debugger-window)))
275 (when debugger-jumping-flag 275 (error nil)))
276 ;; Try to restore previous height of debugger 276 (setq debugger-previous-window debugger-window))
277 ;; window. 277 (message "")
278 (condition-case nil 278 (let ((standard-output nil)
279 (window-resize 279 (buffer-read-only t))
280 debugger-window 280 (message "")
281 (- debugger-previous-window-height 281 ;; Make sure we unbind buffer-read-only in the right buffer.
282 (window-total-height debugger-window))) 282 (save-excursion
283 (error nil))) 283 (recursive-edit))))
284 (setq debugger-previous-window debugger-window))
285 (message "")
286 (let ((standard-output nil)
287 (buffer-read-only t))
288 (message "")
289 ;; Make sure we unbind buffer-read-only in the right buffer.
290 (save-excursion
291 (recursive-edit))))
292 (when (and (window-live-p debugger-window)
293 (eq (window-buffer debugger-window) debugger-buffer))
294 ;; Record height of debugger window.
295 (setq debugger-previous-window-height
296 (window-total-height debugger-window)))
297 (if debugger-will-be-back
298 ;; Restore previous window configuration (Bug#12623).
299 (set-window-configuration window-configuration)
300 (when (and (window-live-p debugger-window) 284 (when (and (window-live-p debugger-window)
301 (eq (window-buffer debugger-window) debugger-buffer)) 285 (eq (window-buffer debugger-window) debugger-buffer))
302 (progn 286 ;; Record height of debugger window.
303 ;; Unshow debugger-buffer. 287 (setq debugger-previous-window-height
304 (quit-restore-window debugger-window debugger-bury-or-kill) 288 (window-total-height debugger-window)))
305 ;; Restore current buffer (Bug#12502). 289 (if debugger-will-be-back
306 (set-buffer debugger-old-buffer))) 290 ;; Restore previous window configuration (Bug#12623).
307 ;; Forget debugger window, it won't be back (Bug#17882). 291 (set-window-configuration window-configuration)
308 (setq debugger-previous-window nil)) 292 (when (and (window-live-p debugger-window)
309 ;; Restore previous state of debugger-buffer in case we were 293 (eq (window-buffer debugger-window) debugger-buffer))
310 ;; in a recursive invocation of the debugger, otherwise just 294 (progn
311 ;; erase the buffer. 295 ;; Unshow debugger-buffer.
312 (when (buffer-live-p debugger-buffer) 296 (quit-restore-window debugger-window debugger-bury-or-kill)
313 (with-current-buffer debugger-buffer 297 ;; Restore current buffer (Bug#12502).
314 (if debugger-previous-state 298 (set-buffer debugger-old-buffer)))
315 (debugger--restore-buffer-state debugger-previous-state) 299 ;; Forget debugger window, it won't be back (Bug#17882).
316 (setq backtrace-insert-header-function nil) 300 (setq debugger-previous-window nil))
317 (setq backtrace-frames nil) 301 ;; Restore previous state of debugger-buffer in case we were
318 (backtrace-print)))) 302 ;; in a recursive invocation of the debugger, otherwise just
319 (with-timeout-unsuspend debugger-with-timeout-suspend) 303 ;; erase the buffer.
320 (set-match-data debugger-outer-match-data))) 304 (when (buffer-live-p debugger-buffer)
321 (setq debug-on-next-call debugger-step-after-exit) 305 (with-current-buffer debugger-buffer
322 debugger-value)))) 306 (if debugger-previous-state
307 (debugger--restore-buffer-state debugger-previous-state)
308 (setq backtrace-insert-header-function nil)
309 (setq backtrace-frames nil)
310 (backtrace-print))))
311 (with-timeout-unsuspend debugger-with-timeout-suspend)
312 (set-match-data debugger-outer-match-data)))
313 (setq debug-on-next-call debugger-step-after-exit)
314 debugger-value))))
323 315
324(defun debugger--print (obj &optional stream) 316(defun debugger--print (obj &optional stream)
325 (condition-case err 317 (condition-case err