分析行为不端的Emacs Lisp的提示?

时间:2009-02-20 03:17:10

标签: emacs profiling elisp dot-emacs

我经常自定义Emacs。最近,我在我的.emacs配置中添加了一些内容,偶尔会将我的CPU固定在100%,但我真的不知道它是什么。

如果我多次按C-g,最终我会收到下面的消息迷你消息,询问我是否要自动保存我的文件然后如果我想完全中止emacs。如果我一直拒绝并继续按C-g,最终我可以恢复正常运行emacs。大约一个小时后它会再次发生。

我可以像我一样继续这样做,评论我最近添加的各种内容,重新启动emacs,试图缩小罪魁祸首,但是进展缓慢。

有没有办法可以直接分析emacs以找出什么lisp函数占用CPU?

4 个答案:

答案 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 bufferC-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,以追踪有问题的人。