elisp 调试,函数失败时显示回溯

elisp debugging, show backtrace when function fails

我想在我 运行 这段代码时看到错误的回溯。

 (make-network-process :name (dbgp-make-listner-name 10004)
                       :server 1
                       :service 10004
                       :family 'ipv4
                       :nowait t
                       :noquery t
                       :filter 'dbgp-comint-setup
                       :sentinel 'dbgp-listener-sentinel
                       :log 'dbgp-listener-log)

https://github.com/gregsexton/ob-ipython/issues/4
这说明我可以看到make-network-process下面发生了什么。

Debugger entered--Lisp error: (file-error "make client process failed" "connection refused" :name "localhost" :buffer # :host "localhost" :service 9988 :nowait nil)
make-network-process(:name "localhost" :buffer # :host "localhost" :service 9988 :nowait nil)
open-network-stream("localhost" # "localhost" 9988 :type plain :nowait nil)
byte-code . . . 
url-open-stream("localhost" # "localhost" 9988)
url-http-find-free-connection("localhost" 9988)
url-http([cl-struct-url "http" nil nil "localhost" 9988 "/execute/default" nil nil t nil t] #128 "234p#005001p07" [(nil) (nil) url-debug retrieval "Synchronous fetching done (%S)" t] 5 "\n\n(fn &rest IGNORED)")
url-retrieve-internal("http://localhost:9988/execute/default" #128 "234p#005001p07" [(nil) (nil) url-debug retrieval "Synchronous fetching done (%S)" t] 5 "\n\n(fn &rest IGNORED)" nil nil)
url-retrieve("http://localhost:9988/execute/default" #[128 

我试过了

toggle-debug-on-error edebug-eval-defun

但是我看不到回溯..

*Backtrace*缓冲区上,我可以看到

Debugger entered: nil
  (progn (debug) (make-network-process :name (dbgp-make-listner-name 10004) :server 1 :service 10004 :family (quote ipv4) :nowait t :noquery t :filter (quote dbgp-comint-setup) :sentinel (quote dbgp-listener-sentinel) :log (quote dbgp-listener-log)))
  eval((progn (debug) (make-network-process :name (dbgp-make-listner-name 10004) :server 1 :service 10004 :family (quote ipv4) :nowait t :noquery t :filter (quote dbgp-comint-setup) :sentinel (quote dbgp-listener-sentinel) :log (quote dbgp-listener-log))) nil)
  edebug-eval-defun(nil)
  apply(edebug-eval-defun nil)
  eval-defun(nil)
  funcall-interactively(eval-defun nil)
  call-interactively(eval-defun record nil)
  command-execute(eval-defun record)
  helm-M-x(nil "eval-defun")
  funcall-interactively(helm-M-x nil "eval-defun")
  call-interactively(helm-M-x nil nil)
  command-execute(helm-M-x)

虽然第一个跟踪显示了后面发生的事情 make-network-process,但我的跟踪并没有深入..

所以问题是如何在回溯中获得更多细节

对于字节编译的 elisp 函数,加载相关库的 未编译 版本通常会为您提供更多详细信息,因为调试器随后可以向您显示 事情发生在函数中的确切位置

然而在这个例子中,make-network-process 是一个 C 函数,所以你现在看到的就是你将从 elisp 调试器中得到的全部内容。

如果您想了解更多,您必须 examine/debug process.c 中的源代码。