Stefan Monnier writes: >>> Toy example: >>> 1. emacs -Q >>> 2. (server-start) >>> 3. (add-hook 'before-make-frame-hook (lambda () (error "frame hook error"))) >>> 4. emacsclient -c >>> >>> The output of emacsclient is: >>> >>> Waiting for Emacs... >>> *ERROR*: frame hook error >>> >>> That's all, there is no way to get more information about the error that >>> happened. >>> >>> Ideally, when emacsclient encounters an error and debug-on-error is >>> non-nil, it should cause Emacs to enter the debugger. >> >> I'm not sure we can allow entering the debugger from server-execute. >> That function is documented as being called from timers and process >> filters, so entering the debugger might be unsafe. > > AFAIK it is perfectly safe to drop into the debugger when running timers > and process-filters. I believe the reason why this doesn't happen here is > because of the `condition-case` used to grab the error and send it to > Emacsclient's output. See patch below. > > We could also offer a way to grab the backtrace and send it over to > Emacsclient's output. > > > Stefan > > > diff --git a/lisp/server.el b/lisp/server.el > index 10f15598221..2536a9c6591 100644 > --- a/lisp/server.el > +++ b/lisp/server.el > @@ -1175,7 +1175,7 @@ server-process-filter > (when prev > (setq string (concat prev string)) > (process-put proc 'previous-string nil))) > - (condition-case err > + (condition-case-unless-debug err > (progn > (server-add-client proc) > ;; Send our pid I tested this and it works for me. I suggest we should install this. Here's a modernized version as a patch which applies to trunk.