我经常自定义Emacs。最近,我在我的.emacs配置中添加了一些内容,偶尔会将我的CPU固定在100%,但我真的不知道它是什么。
如果我多次按C-g,最终我会收到下面的消息迷你消息,询问我是否要自动保存我的文件然后如果我想完全中止emacs。如果我一直拒绝并继续按C-g,最终我可以恢复正常运行emacs。大约一个小时后它会再次发生。
我可以像我一样继续这样做,评论我最近添加的各种内容,重新启动emacs,试图缩小罪魁祸首,但是进展缓慢。
有没有办法可以直接分析emacs以找出什么lisp函数占用CPU?
答案 0 :(得分:50)
将debug-on-quit
设置为t
的建议,以便您可以了解Emacs的最佳状态。您可以将其视为采用单个样本进行抽样分析的形式:通常只需要一个样本即可。
更新:从版本24.3开始,Emacs包含两个配置文件。 profiler.el
中有(新)采样分析器,elp.el
中有(旧)仪器分析器。
采样分析器是documented here。它非常简单易用:
要开始分析,请键入
M-x profiler-start
。您可以选择按处理器使用情况,内存使用情况或两者进行配置。完成某项工作后,键入M-x profiler-report
以显示您选择配置的每个资源的摘要缓冲区。完成分析后,键入M-x profiler-stop
。
以下是我维护的cpu+mem
探查器会话与Perforce/Emacs integration的一些示例输出。我已经扩展了最顶层的函数(progn
)以找出where the CPU time and memory use is coming from。
Function Bytes %
- progn 26,715,850 29%
- let 26,715,850 29%
- while 26,715,850 29%
- let 26,715,850 29%
- cond 26,715,850 29%
- insert 26,715,850 29%
+ c-after-change 26,713,770 29%
+ p4-file-revision-annotate-links 2,080 0%
+ let 20,431,797 22%
+ call-interactively 12,767,261 14%
+ save-current-buffer 10,005,836 11%
+ while 8,337,166 9%
+ p4-annotate-internal 5,964,974 6%
+ p4-annotate 2,821,034 3%
+ let* 2,089,810 2%
你可以看到罪魁祸首是c-after-change
,所以看起来我可以通过locally binding inhibit-modification-hooks
to t
around this code节省大量的CPU时间和内存。
您也可以使用Emacs Lisp Profiler。这个文档没有充分记录:您必须阅读elp.el
中的注释以获取详细信息,但基本上您运行elp-instrument-package
以打开具有给定前缀的所有函数的分析,然后{ {1}}查看结果。
这是输入elp-results
后的一些典型输出,输入4,000行C,然后运行M-x elp-instrument-package RET c- RET
(并使用elp-results
按呼叫计数排序):
elp-sort-by-function
在您的特定情况下,探查器无法立即提供帮助,因为您不知道哪个程序包有问题。但是,如果您可以猜测(或使用Function Name Call Count Elapsed Time Average Time
============================= ========== ============ ============
c-skip-comments-and-strings 107 0.0 0.0
c-valid-offset 78 0.0 0.0
c-set-offset 68 0.031 0.0004558823
c-end-of-macro 52 0.0 0.0
c-neutralize-CPP-line 52 0.0 0.0
c-font-lock-invalid-string 20 0.0 0.0
c-set-style-1 19 0.031 0.0016315789
...
来确定),那么探查器可以帮助您详细诊断问题。
答案 1 :(得分:8)
您是否尝试过:Options->Enter debugger on Quit/C-g
? (这是在emacs22上)
如果您需要调试emacs的启动:使用emacs -q --no-site-file
,请访问.emacs
(或site-start.el
或其他),激活菜单项Options->Enter debugger on Quit/C-g
,然后当它似乎冻结时,菜单项Emacs-Lisp->Evaluate buffer
和C-g
。可能有一种更简单的方法来做这件事.........
答案 2 :(得分:6)
使用dope.el,您可以分析启动时加载的整个.emacs或多个elisp文件。从www.gnufans.net/~deego/pub/emacspub/lisp-mine/dope/
下载 M-x dope-quick-start
会显示一些介绍教程。
修改:原始网址现已解散,但Git Hub上有一个工作镜像:
https://raw.github.com/emacsmirror/dope/master/dope.el
答案 3 :(得分:5)
严格来说,这不是对你的问题的回答,但是你可以使用-q
选项启动emacs,而不是执行注释 - 重新启动操作,将.emacs加载到缓冲区中并用Cx Ce自己评估每个sexpr,以追踪有问题的人。