当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《分析行为不端的EmacsLisp的提示?》经验,为你挑选了4个好方法。

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

如果我多次按下Cg,最终我会在迷你缓冲区下方收到一条消息,询问我是否要自动保存我的文件,然后如果我想完全中止emacs.如果我一直拒绝并按下Cg,最终我可以恢复正常运行emacs.大约一个小时后它会再次发生.

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

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



1> Gareth Rees..:

设置的建议是debug-on-quit为了t让您了解Emacs的最佳状态.您可以将此视为采用单个样本的采样分析形式:通常只需要一个样本即可.


更新:从版本24.3开始,Emacs包含两个分析器.有一个(新的)采样分析器profiler.el和一个(旧的)仪器分析器elp.el.

此处记录了采样分析器.它非常简单易用:

要开始分析,请键入M-x profiler-start.您可以选择按处理器使用情况,内存使用情况或两者进行配置.完成M-x profiler-report某项工作后,键入以显示您选择配置的每个资源的摘要缓冲区.完成分析后,键入M-x profiler-stop.

以下是我维护cpu+mem的Perforce/Emacs集成的探查器会话的一些示例输出.我已经扩展了最顶层的函数(progn),以便找出CPU时间和内存使用的来源.

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,所以看起来我可以通过本地绑定inhibit-modification-hookst这个代码来节省大量的CPU时间和内存.


您也可以使用Emacs Lisp Profiler.这是相当少的文档:你必须阅读elp.el详细信息的注释,但基本上你运行elp-instrument-package打开具有给定前缀的所有函数的分析,然后elp-results查看结果.

这是输入后的一些典型输出M-x elp-instrument-package RET c- RET,为4,000行C,然后运行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
...

在您的特定情况下,分析器不会立即提供帮助,因为您不知道哪个包有问题.但是如果您可以猜测(或者debug-on-quit用于确定它),那么探查器可以帮助您详细诊断问题.



2> luapyad..:

你试过了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它何时冻结.这可能是一种更简单的方法.........



3> 小智..:

使用dope.el,您可以分析启动时加载的整个.emacs或多个elisp文件.从www.gnufans.net/~dego/pub/emacspub/lisp-mine/dope/下载

M-x dope-quick-start 将展示一个小介绍教程.

编辑:原始URL现已不存在,但Git Hub上有一个工作镜像:https:
//raw.github.com/emacsmirror/dope/master/dope.el



4> Nietzche-jou..:

严格来说,这不是你问题的答案,但是你可以使用该-q选项启动emacs,将你的.emacs加载到缓冲区并使用Cx Ce自己评估每个sexpr ,而不是执行注释 - 重新启动的事情.追查违规者.


你不想依次评估每个性别(除非你很少).使用带有"eval-region"的二进制搜索.
推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有