0

我正在尝试ocamldebug与我的项目一起使用,以了解为什么我正在使用的第 3 方库的行为不符合我的预期。

https://ocaml.org/manual/debugger.html

ocamldebug通过以字节码可执行文件的名称作为第一个参数运行程序来调用 OCaml 调试器

我已添加(modes byte exe)到我的dune文件中。

当我运行时,dune build我可以在 exe 旁边看到字节码文件输出,如下所示_build/default/bin/cli.bc

当我将其传递给ocamldebug我时,出现以下错误:

ocamldebug _build/default/bin/cli.bc
    OCaml Debugger version 4.12.0

(ocd) r
Loading program... done.
Fatal error: debugger does not support channel locks
Lost connection with process 33035 (active process)
between time 170000 and time 180000
Restart from time 170000 and try to get closer of the problem ? (y or n)

如果我选择y控制台似乎无限期挂起。

我在这里找到了错误的来源:
https ://github.com/ocaml/ocaml/blob/f68acd1a618ac54790a8347fad466084f15a9a9e/runtime/debugger.c#L144

  /* The code in this file does not bracket channel I/O operations with
     Lock and Unlock, so fail if those are not no-ops. */
  if (caml_channel_mutex_lock != NULL ||
      caml_channel_mutex_unlock != NULL ||
      caml_channel_mutex_unlock_exn != NULL)
    caml_fatal_error("debugger does not support channel locks");

...但我不知道是什么触发了它。

我的项目正在使用cmdliner并且lwt......我认为在执行的早期阶段它没有遇到任何lwt代码。

ocamldebug兼容cmdliner

如果是这种情况,那么我想我将需要创建一个新的入口点来进行调试。(目前bin/cli是我项目中唯一的可执行工件,我需要调试的代码都在lib/s下)

4

1 回答 1

0

看起来您的 macOS 版本的 OCaml 调试器已损坏。请将问题报告给 OCaml 问题跟踪器,包括您系统的详细信息。我无法在我的机器上重现它,但我使用的是相当旧的 macOS (10.11.6) 版本,并且我的 4.12 调试器可以完美运行。

作为一种解决方法,尝试使用旧版本的 OCaml,因为这个频道锁定测试是最近引入的,您可以安装 4.12 之前的任何版本,

opam switch create 4.11.0 
eval $(opam env)

然后,不要忘记重建您的项目(之前安装所需的依赖项),

opam install lwt cmdliner
dune build

然后您可以根据自己的喜好使用调试器。

于 2021-07-15T14:19:47.187 回答