【问题标题】:View/intercept all emacs lisp function calls查看/拦截所有 emacs lisp 函数调用
【发布时间】:2013-12-17 01:10:59
【问题描述】:

我想查看在 emacs 会话期间进行的所有 emacs lisp 函数调用的日志。

我想确切地知道解释器在做什么。如果有意义的话,如何“拦截”解释器的 REPL?

使用 strace,我可以附加到 emacs 进程并查看所有系统调用。但我需要有关哪些 lisp 函数实际负责的更高级别信息。

顺便说一句,这样做的动机是在我的 emacs 会话中调试一个问题,其中 emacs 进程一直在侦听永远不可用的套接字:

recvfrom(4, 0xbd4754, 4096, 0, 0, 0)    = -1 EAGAIN (Resource temporarily unavailable)



# netstat -p |grep 14854
unix  3      [ ]         STREAM     CONNECTED     14854    3040/emacs         

【问题讨论】:

    标签: debugging emacs read-eval-print-loop strace


    【解决方案1】:

    你可以试试M-x profile-start RET RET ... M-x profile-report RET。它不会为您提供完整的跟踪,但会显示任何持续足够时间的函数的调用树。

    顺便说一句,我不知道您要跟踪什么问题。一遍又一遍地调用 recvfrom 并获取 EAGAIN 可能是完全正常的。

    【讨论】:

    • 好提示。显然有一种方法可以调整探查器以完全按照我的意愿去做。此外,我正在跟踪的问题是多种多样的,特别是 emacs 随机操作花费了很长时间。也许你是对的,我在 strace 中注意到的并不是特别相关。
    • 一旦我有时间考虑您的解决方案,我就会回到这个问题。
    【解决方案2】:

    我不知道跟踪所有函数调用的任何东西。这肯定需要在 C 中实现。也许您可以使用一些现有的调试编译选项?

    以下内容对于更有针对性的调试可能仍然有用。 (不过,如果你试图让 Emacs 跟踪 All The Things,Emacs 肯定会停止运行。)

    两个库的评论中都有详细的用法。

    追踪:

    M-x find-library RET trace RET

    ;; M-x trace-function FUNCTION &optional BUFFER
    ;; M-x untrace-function FUNCTION
    ;; M-x untrace-all
    

    Emacs Lisp Profiler (ELP):

    M-x find-library RET elp RET

    ;; M-x elp-instrument-package
    ;; M-x elp-instrument-list
    ;; M-x elp-instrument-function
    ;; M-x elp-reset-*
    ;; M-x elp-results
    ;; M-x elp-restore-all
    

    【讨论】:

      【解决方案3】:

      Elisp 信息手册附带一个节点

      18.2.12 跟踪缓冲区

      由于提到的东西依赖于 edebug,应该是一种从跟踪点到跟踪点并最终杀死的方法。

      WRT 到日志记录,这可能已经使用来自 trace.el 的 trace-function 完成。

      _

      【讨论】:

      • 所以我不想附加到特定函数的执行,而是附加到在 emacs 会话期间调用的所有函数。我已经完成了一个恰当的trace,但没有看到edebug-tracing 函数,也没有定义变量edebug-trace。我已将edebug-trace 设置为 t,但到目前为止还没有出现任何跟踪缓冲区。此功能在哪里提供?
      猜你喜欢
      • 2011-10-16
      • 1970-01-01
      • 2018-08-25
      • 2019-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多