我正在尝试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下)