查看/拦截所有emacs lisp函数调用

时间:2013-12-01 06:35:02

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

我想查看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         

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

Elisp信息手册附带一个节点

18.2.12跟踪缓冲区

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

WRT to logging,可能已经使用来自trace.el的trace-function完成了。

_

答案 2 :(得分:1)

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

以下对于更有针对性的调试仍然有用。 (然而,如果你试图让他们追踪所有的东西,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