GNU bug report logs -
#65897
29.1.50; Debugging errors surfaced through emacsclient is hard
Previous Next
To reply to this bug, email your comments to 65897 AT debbugs.gnu.org.
There is no need to reopen the bug first.
Toggle the display of automated, internal messages from the tracker.
Report forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#65897
; Package
emacs
.
(Tue, 12 Sep 2023 19:43:02 GMT)
Full text and
rfc822 format available.
Acknowledgement sent
to
Spencer Baugh <sbaugh <at> janestreet.com>
:
New bug report received and forwarded. Copy sent to
bug-gnu-emacs <at> gnu.org
.
(Tue, 12 Sep 2023 19:43:02 GMT)
Full text and
rfc822 format available.
Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):
Errors which happen through emacsclient never trigger the debugger and
only print a simple error message, which makes it very difficult to
debug them. If there's an error which, for some reason, only happens
when running emacsclient, then life becomes very difficult. I just
encountered this with one of my users - I still have no idea why the
error only affected emacsclient, or how I could have reproduced it
without emacsclient, I eventually fixed it by bisecting their .emacs.
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.
In GNU Emacs 29.1.50 (build 4, x86_64-pc-linux-gnu, X toolkit, cairo
version 1.15.12, Xaw scroll bars) of 2023-09-11 built on
Repository revision: f9bc92d0b36bc631d11c194e4b580f43b7b8dcba
Repository branch: emacs-29
Windowing system distributor 'The X.Org Foundation', version 11.0.12011000
System Description: Rocky Linux 8.8 (Green Obsidian)
Configured using:
'configure --config-cache --with-x-toolkit=lucid
--with-gif=ifavailable'
Configured features:
CAIRO DBUS FREETYPE GLIB GMP GNUTLS GSETTINGS HARFBUZZ JPEG JSON
LIBSELINUX LIBSYSTEMD LIBXML2 MODULES NOTIFY INOTIFY PDUMPER PNG RSVG
SECCOMP SOUND SQLITE3 THREADS TIFF TOOLKIT_SCROLL_BARS X11 XDBE XIM
XINPUT2 XPM LUCID ZLIB
Important settings:
value of $LANG: en_US.UTF-8
locale-coding-system: utf-8-unix
Major mode: ELisp/l
Minor modes in effect:
bug-reference-prog-mode: t
global-so-long-mode: t
pixel-scroll-precision-mode: t
jane-fe-minor-mode: t
jane-fe-jenga-minor-mode: t
editorconfig-mode: t
which-function-mode: t
global-git-commit-mode: t
magit-auto-revert-mode: t
auto-revert-mode: t
shell-dirtrack-mode: t
server-mode: t
windmove-mode: t
savehist-mode: t
save-place-mode: t
tooltip-mode: t
global-eldoc-mode: t
eldoc-mode: t
show-paren-mode: t
electric-indent-mode: t
mouse-wheel-mode: t
tab-bar-mode: t
menu-bar-mode: t
file-name-shadow-mode: t
context-menu-mode: t
global-font-lock-mode: t
font-lock-mode: t
blink-cursor-mode: t
line-number-mode: t
transient-mark-mode: t
auto-composition-mode: t
auto-encryption-mode: t
auto-compression-mode: t
Features:
(shadow emacsbug calc calc-loaddefs rect calc-macs pcmpl-unix pcmpl-gnu
mule-util reposition face-remap package-x descr-text etags fileloop
cc-mode cc-fonts cc-guess cc-menus cc-cmds cc-styles cc-align cc-engine
cc-vars cc-defs log-view bug-reference cus-start qp sort smiley
gnus-cite mail-extr textsec uni-scripts idna-mapping ucs-normalize
uni-confusable textsec-check gnus-async gnus-bcklg gnus-agent gnus-srvr
gnus-score score-mode nnvirtual nntp gnus-ml gnus-msg disp-table nndoc
gnus-cache gnus-dup mm-archive url-http-ntlm ntlm hmac-md5 hex-util md4
network-stream url-cache debbugs-gnu debbugs-compat debbugs soap-client
url-http url-gw nsm rng-xsd rng-dt rng-util xsd-regexp vc-git shortdoc
async-bytecomp async tramp-cmds tramp-sh tramp-cache time-stamp hl-line
vc vc-dispatcher sh-script treesit cl-print help-fns radix-tree misc
conf-mode dabbrev display-line-numbers goto-addr executable pulse
misearch multi-isearch dired-aux org-element org-persist org-id
org-refile avl-tree generator oc-basic ol-eww eww xdg url-queue mm-url
ol-rmail ol-mhe ol-irc ol-info ol-gnus nnselect gnus-art mm-uu mml2015
mm-view mml-smime smime gnutls dig gnus-sum shr pixel-fill kinsoku
url-file svg dom gnus-group gnus-undo gnus-start gnus-dbus dbus xml
gnus-cloud nnimap nnmail mail-source utf7 nnoo gnus-spec gnus-int
gnus-range gnus-win ol-docview doc-view jka-compr image-mode exif
ol-bibtex bibtex ol-bbdb ol-w3m ol-doi org-link-doi vc-fe find-dired
so-long jane-fe-read-feature pixel-scroll cua-base vc-hg tramp
tramp-loaddefs trampver tramp-integration tramp-compat parse-time
iso8601 ffap jane-merlin merlin-imenu let-alist merlin-xref merlin-cap
merlin jane-async-merlin jane-completion grep jane-common jane-comint
org-protocol jane-fe-project xref files-x jane-fe-menu ecaml_plugin view
gopcaml magit-bookmark bookmark image+ advice image-file image-converter
editorconfig editorconfig-core editorconfig-core-handle
editorconfig-fnmatch whitespace jane-auto-modes vba-mode markdown-mode
color jane jane-yasnippet jane-micro-features ert ewoc debug backtrace
jane-diff unified-test-mode shell-file core core-buffer core-error
jane-sexp jane-python jane-ocaml jane-tuareg-theme tuareg tuareg-compat
tuareg-opam skeleton flymake-proc flymake warnings thingatpt smie
caml-types caml-help caml-emacs find-file compile jane-cr jane-codeium
jane-align jane-deprecated jane-smerge gnu-elpa-keyring-update
jane-ocp-indent ocp-indent jane-eglot yasnippet-autoloads
swiper-autoloads htmlize-autoloads eglot-autoloads
editorconfig-autoloads codeium-autoloads jane-autoloads jane-util
ob-shell page-ext dired-x magit-extras project magit-submodule
magit-obsolete magit-blame magit-stash magit-reflog magit-bisect
magit-push magit-pull magit-fetch magit-clone magit-remote magit-commit
magit-sequence magit-notes magit-worktree magit-tag magit-merge
magit-branch magit-reset magit-files magit-refs magit-status magit
magit-repos magit-apply magit-wip magit-log which-func imenu magit-diff
smerge-mode diff diff-mode git-commit log-edit message sendmail
yank-media puny dired dired-loaddefs rfc822 mml mml-sec epa derived epg
rfc6068 epg-config mm-decode mm-bodies mm-encode mail-parse rfc2231
rfc2047 rfc2045 ietf-drums mailabbrev gmm-utils mailheader pcvs-util
add-log magit-core magit-autorevert autorevert filenotify magit-margin
magit-transient magit-process with-editor shell server magit-mode
transient edmacro kmacro magit-git magit-section magit-utils crm dash
gnus nnheader gnus-util text-property-search mail-utils range mm-util
mail-prsvr cl-extra help-mode windmove org ob ob-tangle ob-ref ob-lob
ob-table ob-exp org-macro org-src ob-comint org-pcomplete pcomplete
org-list org-footnote org-faces org-entities time-date noutline outline
ob-emacs-lisp ob-core ob-eval org-cycle org-table ol rx org-fold
org-fold-core org-keys oc org-loaddefs find-func cal-menu calendar
cal-loaddefs org-version org-compat org-macs format-spec gdb-mi bindat
gud easy-mmode comint ansi-osc ansi-color ring vundo modus-vivendi-theme
modus-themes pcase savehist saveplace cus-edit pp cus-load icons
wid-edit adaptive-wrap-autoloads csv-mode-autoloads
cyberpunk-theme-autoloads evil-autoloads exwm-autoloads helm-autoloads
helm-core-autoloads async-autoloads ivy-autoloads magit-autoloads
git-commit-autoloads finder-inf magit-section-autoloads dash-autoloads
popup-autoloads url-http-ntlm-autoloads url-auth vc-hgcmd-autoloads
vundo-autoloads info with-editor-autoloads xelb-autoloads package
browse-url url url-proxy url-privacy url-expand url-methods url-history
url-cookie generate-lisp-file url-domsuf url-util mailcap url-handlers
url-parse auth-source cl-seq eieio eieio-core cl-macs password-cache
json subr-x map byte-opt gv bytecomp byte-compile url-vars cl-loaddefs
cl-lib rmc iso-transl tooltip cconv eldoc paren electric uniquify
ediff-hook vc-hooks lisp-float-type elisp-mode mwheel term/x-win x-win
term/common-win x-dnd tool-bar dnd fontset image regexp-opt fringe
tabulated-list replace newcomment text-mode lisp-mode prog-mode register
page tab-bar menu-bar rfn-eshadow isearch easymenu timer select
scroll-bar mouse jit-lock font-lock syntax font-core term/tty-colors
frame minibuffer nadvice seq simple cl-generic indonesian philippine
cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao
korean japanese eucjp-ms cp51932 hebrew greek romanian slovak czech
european ethiopic indian cyrillic chinese composite emoji-zwj charscript
charprop case-table epa-hook jka-cmpr-hook help abbrev obarray oclosure
cl-preloaded button loaddefs theme-loaddefs faces cus-face macroexp
files window text-properties overlay sha1 md5 base64 format env
code-pages mule custom widget keymap hashtable-print-readable backquote
threads dbusbind inotify dynamic-setting system-font-setting
font-render-setting cairo x-toolkit xinput2 x multi-tty
make-network-process emacs)
Memory information:
((conses 16 1290183 152090)
(symbols 48 57370 1)
(strings 32 222722 19140)
(string-bytes 1 8502817)
(vectors 16 116575)
(vector-slots 8 2371281 184939)
(floats 8 770 630)
(intervals 56 99161 3193)
(buffers 976 171))
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#65897
; Package
emacs
.
(Thu, 14 Sep 2023 14:55:02 GMT)
Full text and
rfc822 format available.
Message #8 received at 65897 <at> debbugs.gnu.org (full text, mbox):
> From: Spencer Baugh <sbaugh <at> janestreet.com>
> Date: Tue, 12 Sep 2023 15:42:37 -0400
>
> 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.
Stefan, any comments?
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#65897
; Package
emacs
.
(Mon, 18 Sep 2023 14:03:01 GMT)
Full text and
rfc822 format available.
Message #11 received at 65897 <at> debbugs.gnu.org (full text, mbox):
>> 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
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#65897
; Package
emacs
.
(Fri, 29 Aug 2025 21:03:03 GMT)
Full text and
rfc822 format available.
Message #14 received at 65897 <at> debbugs.gnu.org (full text, mbox):
[Message part 1 (text/plain, inline)]
Stefan Monnier <monnier <at> iro.umontreal.ca> 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.
[0001-Allow-entering-the-debugger-on-error-in-server-conne.patch (text/x-patch, inline)]
From b9aa445c6eb92481ac5b02f69eb99f404aca5cdf Mon Sep 17 00:00:00 2001
From: Spencer Baugh <sbaugh <at> janestreet.com>
Date: Fri, 29 Aug 2025 17:00:47 -0400
Subject: [PATCH] Allow entering the debugger on error in server connection
* lisp/server.el (server--process-filter-1): Use
condition-case-unless-debug. (bug#65897)
---
lisp/server.el | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lisp/server.el b/lisp/server.el
index 4415c45971e..70299d52f18 100644
--- a/lisp/server.el
+++ b/lisp/server.el
@@ -1232,7 +1232,7 @@ server--process-filter-1
(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
--
2.43.7
Information forwarded
to
bug-gnu-emacs <at> gnu.org
:
bug#65897
; Package
emacs
.
(Sun, 31 Aug 2025 04:34:03 GMT)
Full text and
rfc822 format available.
Message #17 received at 65897 <at> debbugs.gnu.org (full text, mbox):
> 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.
LGTM,
Stefan
Reply sent
to
Eli Zaretskii <eliz <at> gnu.org>
:
You have taken responsibility.
(Sun, 31 Aug 2025 06:56:01 GMT)
Full text and
rfc822 format available.
Notification sent
to
Spencer Baugh <sbaugh <at> janestreet.com>
:
bug acknowledged by developer.
(Sun, 31 Aug 2025 06:56:01 GMT)
Full text and
rfc822 format available.
Message #22 received at 65897-done <at> debbugs.gnu.org (full text, mbox):
> From: Stefan Monnier <monnier <at> iro.umontreal.ca>
> Cc: Eli Zaretskii <eliz <at> gnu.org>, 65897 <at> debbugs.gnu.org
> Date: Sun, 31 Aug 2025 00:33:06 -0400
>
> > 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.
>
> LGTM,
Thanks, installed on master (with the missing NEWS entry), and
closing the bug.
This bug report was last modified 18 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.