如何在Emacs中实现错误回溯?

时间:2011-06-18 17:09:19

标签: debugging emacs ocaml traceback

我正在Ocaml中编写一个编译器。当我在终端中使用make编译和测试它时,tracback运行良好,例如:

export OCAMLRUNPARAM=b
./Simpler-Basic test.sib
Fatal error: exception Match_failure("interp.ml", 45, 21)
Called from file "interp.ml", line 97, characters 72-86
Called from file "list.ml", line 74, characters 24-34
Called from file "interp.ml", line 108, characters 9-35
Called from file "main.ml", line 54, characters 4-17
make: *** [all] Error 2

但是当我通过Meta-x compile然后make在我的Emacs中编译和测试它时,它不会在缓冲区中显示回溯部分:

make
export OCAMLRUNPARAM=b
./Simpler-Basic test.sib
Fatal error: exception Match_failure("interp.ml", 45, 21)
make: *** [all] Error 2

Compilation exited abnormally with code 2 at Sat Jun 18 19:03:04

我的.emacs中有一部分要做我从朋友那里复制的追溯:http://paste.ubuntu.com/628838/

有人能告诉我如何修改我的.emacs以便它在终端中显示回溯吗?非常感谢你

1 个答案:

答案 0 :(得分:6)

你在哪里写export OCAMLRUNPARAM=b

如果你在makefile中写了这个(↹代表一个标签):

↹export OCAMLRUNPARAM=b
↹./Simpler-Basic test.sib

然后它不起作用,因为每个makefile命令都在一个单独的shell中执行,因此环境变量赋值在第一行完成后消失。您可以在一条逻辑行中组合这两行:

↹export OCAMLRUNPARAM=b; \
↹./Simpler-Basic test.sib

如果您在Emacs中运行Ocaml程序时总是想要回溯,请在.emacs中设置环境变量:

(setenv "OCAMLRUNPARAM" "b")

为了让Emacs将回溯消息识别为带有位置的错误消息,您需要在compilation-regexp-alist中注册它们。在.emacs(未经测试)中添加类似的内容:

(eval-after-load "caml"
  (add-to-list 'compilation-regexp-alist
               '("\\(^Raised at\\|Called from\\) file \"\\([^"\n]+\\)\", line \\([0-9]+\\)"
                 2 3)))