Subject: bug#65060: closed (Re: bug#65060: 29.1.50; display_count_lines segv)

From: [email-masked] (GNU bug Tracking System)
Date: Sat, 12 Aug 2023 12:09:02 +0000

Your bug report

#65060: 29.1.50; display_count_lines segv

which was filed against the emacs package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
65060: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=65060
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#65060: 29.1.50; display_count_lines segv
From: Eli Zaretskii <[email-masked]>
To: Kai Ma <[email-masked]>
Cc: [email-masked]
Date: Sat, 12 Aug 2023 15:08:47 +0300
List-Id: <debbugs-submit.debbugs.gnu.org>

> From: Kai Ma <[email-masked]>
> Date: Sat, 12 Aug 2023 19:56:27 +0800
> Cc: [email-masked]
> 
>  Thanks.  My guess was correct: the buffer in question was killed.
> 
>  Could you please try the patch below, and see if it avoids the
>  crashes?  The patch causes Emacs to signal an error when
>  format-mode-line is called for a dead buffer, so if I did this
>  correctly, you should see that Emacs no longer crashes, but there are
>  error messages about a dead buffer in *Messages*.  If this is what
>  happens, you should then take this up with the dirvish developers, and
>  ask them to avoid calling format-mode-line for a killed buffer.
> 
> Thanks!  The patch prevents the crash.  I will report this to dirvish developers.

Thanks, I've now installed the changes on the emacs-29 branch, and I'm
closing this bug.

Subject: 29.1.50; display_count_lines segv
From: Kai Ma <[email-masked]>
To: [email-masked]
Date: Sat, 05 Aug 2023 05:41:54 +0800
List-Id: <debbugs-submit.debbugs.gnu.org>

Emacs can crash due to memchr on null pointers inside
display_count_lines:

* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
    frame #0: 0x00007ff813c6329d libsystem_platform.dylib`_platform_memchr$VARIANT$Haswell + 29
  * frame #1: 0x000000010005c1ef emacs`display_count_lines(start_byte=1, limit_byte=650, count=17166, byte_pos_ptr=0x00007ff7bfef2ef8) at xdisp.c:28475:14
    frame #2: 0x000000010005c019 emacs`count_lines(start_byte=1, end_byte=650) at xdisp.c:28421:10
    frame #3: 0x00000001002666fe emacs`Fline_number_at_pos(position=(EMACS_INT) $385 = 650, absolute=(struct Lisp_Symbol *) $388 = 0x0000000100908010) at fns.c:6157:20
    frame #4: 0x0000000100244708 emacs`eval_sub(form=(struct Lisp_Cons *) $390 = 0x000000011acc21d0) at eval.c:2501:15
    frame #5: 0x00000001002444da emacs`eval_sub(form=(struct Lisp_Cons *) $392 = 0x000000011acc21e0) at eval.c:2465:25
    frame #6: 0x0000000100246ea4 emacs`Flet(args=(struct Lisp_Cons *) $394 = 0x000000011acc1f80) at eval.c:996:18
    frame #7: 0x0000000100244121 emacs`eval_sub(form=(struct Lisp_Cons *) $396 = 0x000000011acc2200) at eval.c:2449:8
    frame #8: 0x0000000100244f0b emacs`Fprogn(body=(struct Lisp_Symbol *) $399 = 0x0000000100908010) at eval.c:436:13
    frame #9: 0x000000010024cd1b emacs`funcall_lambda(fun=(struct Lisp_Cons *) $401 = 0x000000011acc1560, nargs=1, arg_vector=(struct Lisp_Symbol *) $404 = 0x0000000100908010) at eval.c:3233:11
    frame #10: 0x000000010024adbf emacs`apply_lambda(fun=(struct Lisp_Cons *) $406 = 0x000000011acc1550, args=(struct Lisp_Cons *) $408 = 0x0000000116979d60, count=(bytes = 896)) at eval.c:3103:9
    frame #11: 0x0000000100244c81 emacs`eval_sub(form=(struct Lisp_Cons *) $410 = 0x0000000116cbb2f0) at eval.c:2588:9
    frame #12: 0x000000010024a6b6 emacs`Feval(form=(struct Lisp_Cons *) $412 = 0x0000000116cbb2f0, lexical=(struct Lisp_Symbol *) $415 = 0x0000000100908010) at eval.c:2361:28
    frame #13: 0x000000010024c527 emacs`funcall_subr(subr=0x0000000100406c58, numargs=1, args=(struct Lisp_Symbol *) $418 = 0x0000000100908010) at eval.c:3036:15
    frame #14: 0x000000010024c1e5 emacs`funcall_general(fun=(struct Lisp_Subr *) $423 = 0x0000000100406c58, numargs=1, args=(struct Lisp_Symbol *) $426 = 0x0000000100908010) at eval.c:2941:12
    frame #15: 0x0000000100247644 emacs`Ffuncall(nargs=2, args=(struct Lisp_Symbol *) $429 = 0x0000000100908010) at eval.c:2995:21
    frame #16: 0x00000001002487f4 emacs`internal_condition_case_n(bfun=(emacs`Ffuncall at eval.c:2975), nargs=2, args=(struct Lisp_Symbol *) $432 = 0x0000000100908010, handlers=(struct Lisp_Symbol *) $435 = 0x0000000100908040, hfun=(emacs`safe_eval_handler at xdisp.c:3025)) at eval.c:1558:25
    frame #17: 0x000000010003e5e4 emacs`safe__call(inhibit_quit=true, nargs=2, func=(struct Lisp_Symbol *) $438 = 0x000000010090e370, ap=0x00007ff7bfef3d10) at xdisp.c:3059:13
    frame #18: 0x000000010003e753 emacs`safe__call1(inhibit_quit=true, fn=(struct Lisp_Symbol *) $441 = 0x000000010090e370) at xdisp.c:3095:12
    frame #19: 0x00000001000a620a emacs`safe__eval(inhibit_quit=true, sexpr=(struct Lisp_Cons *) $443 = 0x0000000116cbb2f0) at xdisp.c:3109:10
    frame #20: 0x000000010004f6ad emacs`display_mode_element(it=0x00007ff7bfef45a0, depth=2, field_width=0, precision=0, elt=(struct Lisp_Cons *) $445 = 0x0000000116cbb2d0, props=(struct Lisp_Symbol *) $448 = 0x0000000100908010, risky=false) at xdisp.c:27387:10
    frame #21: 0x000000010004fb29 emacs`display_mode_element(it=0x00007ff7bfef45a0, depth=1, field_width=0, precision=0, elt=(struct Lisp_Cons *) $450 = 0x0000000116cbb2c0, props=(struct Lisp_Symbol *) $453 = 0x0000000100908010, risky=false) at xdisp.c:27473:13
    frame #22: 0x000000010005bf1a emacs`Fformat_mode_line(format=(struct Lisp_Cons *) $455 = 0x0000000116cbb2c0, face=(struct Lisp_Symbol *) $458 = 0x0000000100908010, window=(struct window *) $463 = 0x00000002fbf9d428, buffer=(struct buffer *) $468 = 0x00000001033b8410) at xdisp.c:27700:3
    frame #23: 0x0000000100244760 emacs`eval_sub(form=(struct Lisp_Cons *) $470 = 0x0000000116cbb280) at eval.c:2508:15
    frame #24: 0x000000010024684b emacs`FletX(args=(struct Lisp_Cons *) $472 = 0x0000000116cbb190) at eval.c:934:10
    frame #25: 0x0000000100244121 emacs`eval_sub(form=(struct Lisp_Cons *) $474 = 0x0000000116cbb180) at eval.c:2449:8
    frame #26: 0x000000010024a6b6 emacs`Feval(form=(struct Lisp_Cons *) $476 = 0x0000000116cbb180, lexical=(struct Lisp_Symbol *) $479 = 0x0000000100908010) at eval.c:2361:28
    frame #27: 0x000000010024c527 emacs`funcall_subr(subr=0x0000000100406c58, numargs=1, args=(struct Lisp_Symbol *) $482 = 0x0000000100908010) at eval.c:3036:15
    frame #28: 0x000000010024c1e5 emacs`funcall_general(fun=(struct Lisp_Subr *) $487 = 0x0000000100406c58, numargs=1, args=(struct Lisp_Symbol *) $490 = 0x0000000100908010) at eval.c:2941:12
    frame #29: 0x0000000100247644 emacs`Ffuncall(nargs=2, args=(struct Lisp_Symbol *) $493 = 0x0000000100908010) at eval.c:2995:21
    frame #30: 0x00000001002487f4 emacs`internal_condition_case_n(bfun=(emacs`Ffuncall at eval.c:2975), nargs=2, args=(struct Lisp_Symbol *) $496 = 0x0000000100908010, handlers=(struct Lisp_Symbol *) $499 = 0x0000000100908040, hfun=(emacs`safe_eval_handler at xdisp.c:3025)) at eval.c:1558:25
    frame #31: 0x000000010003e5e4 emacs`safe__call(inhibit_quit=true, nargs=2, func=(struct Lisp_Symbol *) $502 = 0x000000010090e370, ap=0x00007ff7bfef6140) at xdisp.c:3059:13
    frame #32: 0x000000010003e753 emacs`safe__call1(inhibit_quit=true, fn=(struct Lisp_Symbol *) $505 = 0x000000010090e370) at xdisp.c:3095:12
    frame #33: 0x00000001000a620a emacs`safe__eval(inhibit_quit=true, sexpr=(struct Lisp_Cons *) $507 = 0x0000000116cbb180) at xdisp.c:3109:10
    frame #34: 0x000000010004f6ad emacs`display_mode_element(it=0x00007ff7bfef6a20, depth=2, field_width=0, precision=0, elt=(struct Lisp_Cons *) $509 = 0x0000000116cbb160, props=(struct Lisp_Symbol *) $512 = 0x0000000100908010, risky=false) at xdisp.c:27387:10
    frame #35: 0x000000010004fb29 emacs`display_mode_element(it=0x00007ff7bfef6a20, depth=1, field_width=0, precision=0, elt=(struct Lisp_Cons *) $514 = 0x0000000116cbb150, props=(struct Lisp_Symbol *) $517 = 0x0000000100908010, risky=false) at xdisp.c:27473:13
    frame #36: 0x000000010003036a emacs`display_mode_line(w=0x00000002fbf9d428, face_id=MODE_LINE_INACTIVE_FACE_ID, format=(struct Lisp_Cons *) $519 = 0x0000000116cbb150) at xdisp.c:26899:7
    frame #37: 0x0000000100085135 emacs`display_mode_lines(w=0x00000002fbf9d428) at xdisp.c:26812:7
    frame #38: 0x0000000100091eec emacs`redisplay_window(window=(struct window *) $524 = 0x00000002fbf9d428, just_this_one_p=false) at xdisp.c:20535:7
    frame #39: 0x000000010008de7d emacs`redisplay_window_0(window=(struct window *) $529 = 0x00000002fbf9d428) at xdisp.c:17616:5
    frame #40: 0x0000000100248623 emacs`internal_condition_case_1(bfun=(emacs`redisplay_window_0 at xdisp.c:17614), arg=(struct window *) $534 = 0x00000002fbf9d428, handlers=(struct Lisp_Cons *) $536 = 0x0000000104de93c0, hfun=(emacs`redisplay_window_error at xdisp.c:17596)) at eval.c:1498:25
    frame #41: 0x000000010008ca6c emacs`redisplay_windows(window=(struct window *) $541 = 0x00000002fbf9d428) at xdisp.c:17585:4
    frame #42: 0x000000010008ca1b emacs`redisplay_windows(window=(struct window *) $546 = 0x00000002fbe51310) at xdisp.c:17579:2
    frame #43: 0x000000010008ca1b emacs`redisplay_windows(window=(struct window *) $551 = 0x00000002fbed1258) at xdisp.c:17579:2
    frame #44: 0x000000010004b0b4 emacs`redisplay_internal at xdisp.c:17035:5
    frame #45: 0x0000000100051659 emacs`redisplay at xdisp.c:16218:3
    frame #46: 0x0000000100163e49 emacs`read_char(commandflag=1, map=(struct Lisp_Cons *) $553 = 0x000000011cb67780, prev_event=(struct Lisp_Symbol *) $556 = 0x0000000100908010, used_mouse_menu=0x00007ff7bfefe10f, end_time=0x0000000000000000) at keyboard.c:2636:6
    frame #47: 0x0000000100160ad8 emacs`read_key_sequence(keybuf=(struct Lisp_Symbol *) $559 = 0x0000000100908010, prompt=(struct Lisp_Symbol *) $562 = 0x0000000100908010, dont_downcase_last=false, can_return_switch_frame=true, fix_current_buffer=true, prevent_redisplay=false) at keyboard.c:10083:12
    frame #48: 0x000000010015ee80 emacs`command_loop_1 at keyboard.c:1384:15
    frame #49: 0x0000000100248558 emacs`internal_condition_case(bfun=(emacs`command_loop_1 at keyboard.c:1278), handlers=(struct Lisp_Symbol *) $565 = 0x00000001009080a0, hfun=(emacs`cmd_error at keyboard.c:936)) at eval.c:1474:25
    frame #50: 0x000000010015e923 emacs`command_loop_2(handlers=(struct Lisp_Symbol *) $568 = 0x00000001009080a0) at keyboard.c:1133:11
    frame #51: 0x0000000100247ce3 emacs`internal_catch(tag=(struct Lisp_Symbol *) $571 = 0x00000001009174c0, func=(emacs`command_loop_2 at keyboard.c:1129), arg=(struct Lisp_Symbol *) $574 = 0x00000001009080a0) at eval.c:1197:25
    frame #52: 0x000000010015dc9a emacs`command_loop at keyboard.c:1111:2
    frame #53: 0x000000010015da9f emacs`recursive_edit_1 at keyboard.c:720:9
    frame #54: 0x000000010015e012 emacs`Frecursive_edit at keyboard.c:803:3
    frame #55: 0x000000010015ae48 emacs`main(argc=1, argv=0x00007ff7bfefec90) at emacs.c:2529:3
    frame #56: 0x00007ff8138de41f dyld`start + 1903

xbacktrace:

(unsigned char *) data = 0x00000001003d4d0b "line-number-at-pos"
(unsigned char *) data = 0x00000001003c6842 "-"
(unsigned char *) data = 0x00000001003d45c5 "let"
(unsigned char *) data = 0x0000000120f94b50 "dirvish-index-ml"
(unsigned char *) data = 0x00000001003d4651 "eval"
(unsigned char *) data = 0x00000001003c694f "format-mode-line"
(unsigned char *) data = 0x00000001003d45c9 "let*"
(unsigned char *) data = 0x00000001003d4651 "eval"
(unsigned char *) data = 0x00000001003d8fe6 "redisplay_internal (C function)"

I took a quick look at the function, and it turns out the cursor can be
null even on the first iteration.  After applying the following change,
I can see "cursor is null" printed out just before the crash.

diff --git a/src/xdisp.c b/src/xdisp.c
index 9cddcfeda27..f994021bb3c 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -28457,6 +28457,8 @@ display_count_lines (ptrdiff_t start_byte,
 	  ceiling = min (limit_byte - 1, ceiling);
 	  ceiling_addr = BYTE_POS_ADDR (ceiling) + 1;
 	  base = (cursor = BYTE_POS_ADDR (start_byte));
+	  if (! cursor)
+	    fprintf (stderr, "cursor is null\n");
 
 	  do
 	    {

The crash occurred when I was trying out dirvish with
display-line-numbers-mode enabled.  Unfortunately, this crash is not
quite easy to reproduce.  The best recipe I got so far is:

1. Create init.el

    (require 'package)
    (add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t)
    (use-package dirvish :ensure t :config (dirvish-override-dired-mode))
    (global-display-line-numbers-mode +1)
    (dirvish-override-dired-mode)

2. emacs -q -l init.el

3. M-x dirvish

4. randomly kill dirvish buffers, and/or randomly delete dirvish windows.

Chances are, at some point, Emacs crashes due to the above segv.  I have
reproduced the crash in emacs -q, but it was not easy.  I will try to
find a better recipe and post it here.

In GNU Emacs 29.1.50 (build 1, x86_64-apple-darwin22.6.0, NS
 appkit-2299.70 Version 13.5 (Build 22G74)) of 2023-08-03 built on
 Kais-MacBook.local
Repository revision: 7280e6aaa1978c6e26c4286db9c446fa74637fa4
Repository branch: emacs-29
Windowing system distributor 'Apple', version 10.3.2299
System Description:  macOS 13.5

Configured using:
 'configure --with-xwidgets --with-ns --with-tree-sitter -C
 'LDFLAGS=-L/usr/local/opt/llvm/lib -L/usr/local/opt/bison/lib
 -L/usr/local/opt/flex/lib' 'CPPFLAGS=-I/usr/local/opt/llvm/include
 -I/usr/local/opt/flex/include''

Configured features:
ACL DBUS GIF GLIB GMP GNUTLS JPEG JSON LCMS2 LIBXML2 MODULES NOTIFY
KQUEUE NS PDUMPER PNG RSVG SQLITE3 THREADS TIFF TOOLKIT_SCROLL_BARS
TREE_SITTER WEBP XIM XWIDGETS ZLIB

Important settings:
  value of $LC_ALL: zh_CN.utf-8
  value of $LANG: zh_CN.utf-8
  locale-coding-system: utf-8-unix

Major mode: VTerm

Minor modes in effect:
  repeat-mode: t
  vterm-copy-mode: t
  goto-address-mode: t
  global-git-commit-mode: t
  magit-auto-revert-mode: t
  shell-dirtrack-mode: t
  diff-hl-margin-mode: t
  recentf-mode: t
  yas-global-mode: t
  yas-minor-mode: t
  doom-modeline-mode: t
  winner-mode: t
  winum-mode: t
  which-key-mode: t
  global-hl-line-mode: t
  solaire-global-mode: t
  projectile-mode: t
  vertico-multiform-mode: t
  vertico-mouse-mode: t
  vertico-mode: t
  keyfreq-autosave-mode: t
  keyfreq-mode: t
  evil-leader-mode: t
  global-evil-surround-mode: t
  evil-surround-mode: t
  global-evil-collection-unimpaired-mode: t
  evil-collection-unimpaired-mode: t
  diredfl-global-mode: t
  evil-mode: t
  evil-local-mode: t
  corfu-popupinfo-mode: t
  global-corfu-mode: t
  marginalia-mode: t
  prescient-persist-mode: t
  global-ligature-mode: t
  ligature-mode: t
  pixel-scroll-precision-mode: t
  save-place-mode: t
  server-mode: t
  electric-pair-mode: t
  global-so-long-mode: t
  delete-selection-mode: t
  global-auto-revert-mode: t
  override-global-mode: t
  tooltip-mode: t
  global-eldoc-mode: t
  show-paren-mode: t
  electric-indent-mode: t
  mouse-wheel-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
  buffer-read-only: t
  column-number-mode: t
  line-number-mode: t
  transient-mark-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t

Load-path shadows:
/Users/kaima/.emacs.d/elpa/transient-20230723.1411/transient hides /Applications/Emacs.app/Contents/Resources/lisp/transient

Features:
(shadow ecomplete emacsbug tramp-archive tramp-gvfs tabify
evil-collection-man man semantic/ia semantic/analyze/refs
semantic/db-find semantic/db-ref semantic/senator semantic/decorate
semantic/analyze semantic/sort semantic/scope semantic/analyze/fcn
semantic/db eieio-base semantic/ctxt semantic/format semantic/tag-ls
semantic/find evil-collection-ripgrep ripgrep evil-collection-wgrep
wgrep repeat evil-collection-vterm vterm tramp tramp-loaddefs trampver
tramp-integration tramp-compat evil-collection-term term ehelp
vterm-module term/xterm xterm evil-collection-sh-script sh-script smie
executable citre citre-global citre-tags citre-ctags citre-readtags
citre-readtags-tables citre-backend-interface citre-ui-peek
citre-ui-jump citre-common-tag citre-common-util c-ts-mode c-ts-common
all-the-icons-ibuffer htmlfontify url-http url-gw url-auth
evil-collection-shortdoc shortdoc cus-start flow-fill mm-archive
gnus-html url-queue url-cache mm-url sort smiley gnus-cite mail-extr
textsec uni-scripts idna-mapping uni-confusable textsec-check gnus-async
gnus-bcklg gnus-dup qp gnus-ml disp-table align evil-collection-speedbar
speedbar ezimage dframe haskell-mode haskell-cabal haskell-utils
haskell-font-lock haskell-indentation haskell-string
haskell-sort-imports haskell-lexeme haskell-align-imports
haskell-complete-module haskell-ghc-support evil-collection-flymake
flymake-proc flymake etags fileloop haskell-customize nndraft nnmh utf-7
nnfolder nnnil gnus-agent gnus-srvr gnus-score score-mode nnvirtual
gnus-msg gnus-art mm-uu mml2015 mm-view mml-smime smime gnutls dig nntp
gnus-cache gnus-sum shr pixel-fill kinsoku url-file gnus-topic
gnus-group gnus-undo gnus-start gnus-dbus dbus gnus-cloud nnimap nnmail
mail-source utf7 nnoo gnus-spec gnus-int gnus-range gnus-win
evil-collection-gnus gnus nnheader range org-protocol goto-addr
org-capture magit-extras magit-bookmark evil-collection-magit
magit-submodule 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 magit-diff smerge-mode diff
git-commit evil-collection-log-edit log-edit message sendmail yank-media
rfc822 mml mml-sec evil-collection-epa epa gnus-util mm-decode mm-bodies
mm-encode mail-parse rfc2231 rfc2047 rfc2045 mm-util ietf-drums
mail-prsvr mailabbrev mail-utils gmm-utils mailheader add-log magit-core
magit-autorevert magit-margin magit-transient magit-process with-editor
shell magit-mode transient magit-git magit-base which-func ido
evil-collection-magit-section magit-section benchmark cursor-sensor crm
org-clock evil-org-agenda evil-org evil-collection-org citeproc
citeproc-itemgetters citeproc-biblatex parse-time citeproc-bibtex
parsebib ol-bibtex bibtex iso8601 citeproc-cite citeproc-subbibs
citeproc-sort citeproc-name citeproc-formatters citeproc-number rst
citeproc-proc citeproc-disamb citeproc-itemdata
citeproc-generic-elements citeproc-macro citeproc-choose citeproc-date
citeproc-context citeproc-prange citeproc-style citeproc-locale
citeproc-term citeproc-rt citeproc-lib citeproc-s oc-bibtex ox-odt
rng-loc rng-uri rng-parse rng-match rng-dt rng-util rng-pttrn nxml-parse
nxml-ns nxml-enc xmltok nxml-util ox-latex ox-icalendar org-agenda
ox-html table ox-ascii ox-publish ox org-element org-persist org-id
org-refile avl-tree org-tempo tempo org time-date ob-d2 ob-dot ob-python
evil-collection-python python treesit ob-rust ob-C ccls
ccls-member-hierarchy ccls-inheritance-hierarchy ccls-call-hierarchy
ccls-tree ccls-code-lens ccls-semantic-highlight ccls-common lsp-mode
lsp-protocol spinner network-stream puny nsm
evil-collection-markdown-mode markdown-mode evil-collection-outline
noutline outline ht inline epg rfc6068 epg-config cc-mode cc-fonts
cc-guess cc-menus cc-cmds cc-styles cc-align cc-engine ob-emacs-lisp
org-table org-loaddefs evil-collection-calendar cal-menu calendar
cal-loaddefs ob ob-tangle ol ob-ref ob-lob ob-table ob-exp org-macro
org-src org-keys oc ob-comint ob-core org-cycle org-fold ob-eval
semantic/symref/grep semantic/symref semantic/util-modes semantic/util
semantic semantic/tag semantic/lex semantic/fw mode-local cedet
consult-xref evil-collection-consult consult evil-collection-bookmark
bookmark org-pcomplete pcomplete evil-collection-xref xref org-list
org-footnote org-fold-core org-entities org-faces org-version
bug-reference misearch multi-isearch all-the-icons-dired dired-filter
dired-hacks-utils dired-aux dired-x org-compat autoinsert org-macs
format-spec info-colors jka-compr vertico-directory
evil-collection-helpful helpful cc-langs cc-vars cc-defs
evil-collection-imenu imenu trace evil-collection-edebug edebug
info-look help-fns radix-tree evil-collection-elisp-refs elisp-refs
pulse hideshow display-line-numbers hl-todo rainbow-delimiters copilot
copilot-balancer editorconfig editorconfig-core editorconfig-core-handle
editorconfig-fnmatch jsonrpc evil-collection-ert ert
evil-collection-debug debug backtrace find-func warnings symbol-overlay
evil-collection-diff-hl diff-hl-margin diff-hl-dired diff-hl vc-hg
evil-collection-vc-git vc-git evil-collection-log-view log-view
pcvs-util evil-collection-vc-dir vc-dir ewoc vc vc-dispatcher
evil-collection-diff-mode diff-mode recentf tree-widget
yasnippet-snippets yasnippet doom-modeline doom-modeline-segments
let-alist doom-modeline-env doom-modeline-core shrink-path f f-shortdoc
s nerd-icons nerd-icons-faces nerd-icons-data nerd-icons-data-mdicon
nerd-icons-data-flicon nerd-icons-data-codicon nerd-icons-data-devicon
nerd-icons-data-sucicon nerd-icons-data-wicon nerd-icons-data-faicon
nerd-icons-data-powerline nerd-icons-data-octicon
nerd-icons-data-pomicon nerd-icons-data-ipsicon winner winum
evil-collection-which-key which-key hl-line solaire-mode face-remap
projectile project skeleton ibuf-macs find-dired lisp-mnt
evil-collection-grep grep evil-collection-compile compile
text-property-search evil-collection-comint comint ansi-osc ansi-color
ibuf-ext evil-collection-ibuffer ibuffer ibuffer-loaddefs
evil-collection-vertico vertico-multiform vertico-mouse vertico
hardhacker-theme keyfreq prelude-nix prelude-evil evil-leader
evil-surround evil-collection-unimpaired evil-collection-tabulated-list
evil-collection-tab-bar evil-collection-so-long evil-collection-simple
evil-collection-replace evil-collection-process-menu
evil-collection-popup evil-collection-package-menu evil-collection-info
evil-collection-indent evil-collection-image image-mode
evil-collection-dired diredfl dired dired-loaddefs exif
evil-collection-help evil-collection-eshell em-prompt esh-mode
evil-collection-elisp-mode evil-collection-eldoc evil-collection-custom
evil-collection-corfu evil-collection-buff-menu evil-collection annalist
evil evil-integration evil-maps evil-commands evil-digraphs reveal
evil-jumps evil-command-window evil-search evil-ex evil-types
evil-macros evil-repeat evil-states evil-core evil-common thingatpt rect
evil-vars prelude-irc prelude-apps prelude-mail prelude-os prelude-help
prelude-lang-zig prelude-lang-web prelude-lang-agda agda2
prelude-lang-haskell prelude-lang-js prelude-lang-ml prelude-lang-coq
prelude-lang-rust prelude-lang-python prelude-lang-cc prelude-lang-lisp
prelude-prog prelude-blog prelude-org prelude-tex prelude-git
prelude-dired prelude-chinese rime rime-predicates derived xdg posframe
popup dash prelude-ibuffer prelude-search prelude-completion kind-icon
svg-lib color svg dom xml corfu-popupinfo corfu cape marginalia
orderless prescient char-fold prelude-project prelude-ui cus-edit pp
cus-load icons wid-edit rx ligature all-the-icons all-the-icons-faces
data-material data-weathericons data-octicons data-fileicons
data-faicons data-alltheicons pixel-scroll cua-base prelude-core hydra
ring lv saveplace adaptive-wrap dabbrev server finder-inf elec-pair
diminish exec-path-from-shell eshell esh-cmd esh-ext esh-opt esh-proc
esh-io esh-arg esh-module esh-groups esh-util files-x undohist edmacro
kmacro so-long delsel autorevert filenotify prelude-benchmark
benchmark-init advice cl-extra help-mode prelude-common prelude-iload
queue generator cl prelude-package vc-use-package pcase use-package
use-package-delight use-package-diminish use-package-bind-key bind-key
easy-mmode prelude-loaddefs no-littering compat 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 eieio eieio-core password-cache json subr-x map byte-opt
url-vars cl-macs gv use-package-ensure cl-seq use-package-core
cl-loaddefs cl-lib bytecomp byte-compile info adaptive-wrap-autoloads
alert-autoloads all-the-icons-dired-autoloads
all-the-icons-ibuffer-autoloads auctex-autoloads tex-site
benchmark-init-autoloads cape-autoloads carbon-now-sh-autoloads
cargo-autoloads catppuccin-theme-autoloads ccls-autoloads
cdlatex-autoloads cider-autoloads citeproc-autoloads citre-autoloads
clojure-mode-autoloads company-coq-autoloads company-math-autoloads
company-autoloads copilot-autoloads corfu-autoloads d2-mode-autoloads
dap-mode-autoloads bui-autoloads dash-at-point-autoloads
dashboard-autoloads debbugs-autoloads deft-autoloads devdocs-autoloads
diff-hl-autoloads diminish-autoloads dired-filter-autoloads
dired-hacks-utils-autoloads diredfl-autoloads dirvish-autoloads
doom-modeline-autoloads doom-themes-autoloads dracula-theme-autoloads
dumb-jump-autoloads dune-autoloads ebib-autoloads editorconfig-autoloads
ef-themes-autoloads elfeed-autoloads embark-consult-autoloads
consult-autoloads embark-autoloads evil-collection-autoloads
annalist-autoloads evil-leader-autoloads evil-org-autoloads
evil-surround-autoloads evil-autoloads exec-path-from-shell-autoloads
expand-region-autoloads flycheck-haskell-autoloads flycheck-autoloads
forge-autoloads closql-autoloads emacsql-autoloads geiser-autoloads
ghub-autoloads gntp-autoloads go-translate-autoloads
google-translate-autoloads goto-chg-autoloads gptel-autoloads
haskell-mode-autoloads helpful-autoloads elisp-refs-autoloads
hl-todo-autoloads info-colors-autoloads js2-mode-autoloads
keyfreq-autoloads kind-icon-autoloads ligature-autoloads log4e-autoloads
lsp-docker-autoloads lsp-treemacs-autoloads lsp-ui-autoloads
lsp-mode-autoloads lua-mode-autoloads magit-autoloads
git-commit-autoloads marginalia-autoloads markdown-mode-autoloads
math-symbol-lists-autoloads merlin-autoloads minimap-autoloads
modern-cpp-font-lock-autoloads modus-themes-autoloads
multiple-cursors-autoloads nerd-icons-autoloads nix-mode-autoloads
magit-section-autoloads nix-sandbox-autoloads no-littering-autoloads
nov-autoloads esxml-autoloads kv-autoloads ob-d2-autoloads
ob-rust-autoloads one-themes-autoloads orderless-autoloads
org-appear-autoloads org-preview-html-autoloads org-xlatex-autoloads
ormolu-autoloads paredit-autoloads parsebib-autoloads parseedn-autoloads
parseclj-autoloads pdf-tools-autoloads pinyinlib-autoloads
pkg-info-autoloads epl-autoloads prescient-autoloads
proof-general-autoloads proof-site proof-autoloads queue-autoloads
quickrun-autoloads racket-mode-autoloads rainbow-delimiters-autoloads
rainbow-mode-autoloads rime-autoloads popup-autoloads ripgrep-autoloads
rotate-autoloads sesman-autoloads shrink-path-autoloads f-autoloads
sly-autoloads smartparens-autoloads solaire-mode-autoloads
speed-type-autoloads spinner-autoloads string-inflection-autoloads
svg-lib-autoloads symbol-overlay-autoloads tablist-autoloads
telega-autoloads rainbow-identifiers-autoloads theme-emacs-autoloads
transient-autoloads treemacs-all-the-icons-autoloads
all-the-icons-autoloads treemacs-persp-autoloads persp-mode-autoloads
treemacs-projectile-autoloads projectile-autoloads
treemacs-tab-bar-autoloads treemacs-autoloads cfrs-autoloads
posframe-autoloads ht-autoloads hydra-autoloads lv-autoloads
pfuture-autoloads ace-window-autoloads avy-autoloads s-autoloads
treepy-autoloads undohist-autoloads utop-autoloads tuareg-autoloads
caml-autoloads valign-autoloads vc-use-package-autoloads
vertico-autoloads visual-fill-column-autoloads vterm-toggle-autoloads
vterm-autoloads vundo-autoloads wakatime-mode-autoloads
web-mode-autoloads wgrep-autoloads which-key-autoloads winum-autoloads
dash-autoloads with-editor-autoloads compat-autoloads yaml-autoloads
yasnippet-snippets-autoloads yasnippet-autoloads zig-mode-autoloads
reformatter-autoloads rmc iso-transl tooltip cconv eldoc paren electric
uniquify ediff-hook vc-hooks lisp-float-type elisp-mode mwheel
term/ns-win ns-win ucs-normalize mule-util term/common-win 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 xwidget-internal dbusbind
kqueue cocoa ns lcms2 multi-tty make-network-process emacs)

Memory information:
((conses 16 1809150 1742795)
 (symbols 48 93202 23)
 (strings 32 361902 89427)
 (string-bytes 1 11206118)
 (vectors 16 116188)
 (vector-slots 8 3198247 827822)
 (floats 8 2706 12115)
 (intervals 56 58501 31705)
 (buffers 984 62))