Как отследить ошибку «failwith» в Emacs? - PullRequest
2 голосов
/ 27 января 2012

Я пишу OCaml под Emacs. Я уже настроил Emacs так, чтобы Meta-x compile и make -k выдавали предупреждения с гиперссылкой. Но для ошибок, вызванных failwith, он не может дать гиперссылку, например:

analyzing (ZONE)...
Fatal error: exception Failure("to do")
Raised at file "pervasives.ml", line 22, characters 22-33
Called from file "list.ml", line 69, characters 12-15
make: *** [all] Error 2

Compilation exited abnormally with code 2 at Fri Jan 27 18:44:10

У меня есть много failwith "to do" в моем коде, и мне нужно знать, какой из них вызывает ошибку, кто-нибудь знает, как позволить Emacs обнаружить такую ​​ошибку?

Ответы [ 2 ]

3 голосов
/ 28 января 2012

См. следующий отчет об ошибке , чтобы добавить некоторые elisp в ваши .emacs, чтобы основной режим компиляции знал, как анализировать отчеты о возврате OCaml.

Вот предлагаемый код (плюс крючки в режиме туарегов):

(defun caml-change-error-alist-for-backtraces ()
  "Hook to change the compilation-error-regexp-alist variable, to
   search the ocaml backtraces for error locations"
  (interactive)
  (progn
    (setq compilation-error-regexp-alist-alist
          (append
           '((caml-backtrace
"^ *\\(?:Raised at\\|Called from\\) file \\(\"?\\)\\([^,\" \n\t<>]+\\)\\1,\
 lines? \\([0-9]+\\)-?\\([0-9]+\\)?\\(?:$\\|,\
\\(?: characters? \\([0-9]+\\)-?\\([0-9]+\\)?:?\\)?\\)"
              2 (3 . 4) (5 . 6)))
           compilation-error-regexp-alist-alist))
    (setq compilation-error-regexp-alist
          (append compilation-error-regexp-alist '(caml-backtrace)))))

(add-hook 'caml-mode-hook 'caml-change-error-alist-for-backtraces)
(add-hook 'tuareg-mode-hook 'caml-change-error-alist-for-backtraces)


(defun caml-change-error-alist-for-assert-failure ()
  "Hook to change the compilation-error-regexp-alist variable, to
   search the assert failure messages for error locations"
  (interactive)
  (progn
    (setq compilation-error-regexp-alist-alist
          (append
           '((caml-assert-failure
              "Assert_failure(\"\\([^,\" \n\t<>]+\\)\", \\([0-9]+\\), \\([0-9]+\\))"
              1 2 3))
           compilation-error-regexp-alist-alist))
    (setq compilation-error-regexp-alist
          (append compilation-error-regexp-alist '(caml-assert-failure)))))

(add-hook 'caml-mode-hook 'caml-change-error-alist-for-assert-failure)
(add-hook 'tuareg-mode-hook 'caml-change-error-alist-for-assert-failure)
2 голосов
/ 27 января 2012

Иногда компиляция в байт-код дает более точные трассировки стека.

  1. Убедитесь, что вы компилируете с опцией -g (или используйте тег debug с ocamlbuild)
  2. Компиляция в байт-код, трассировки стека более точны.
  3. Убедитесь, что в $OCAMLRUNPARAM установлена ​​опция b (см. здесь )

M-x next-error позволит позволить вам следовать трассировке стека (если вы используете caml-mode из дистрибутива и по крайней мере OCaml 3.11).

...