无法在ocamldebug中设置断点:“找不到任何事件。”

10
我正在使用OCaml 4.02.1中的ocamldebug,我想在特定模块内设置断点,但是我得到的只是一个有限的错误信息:Can't find any event there. 以下是一个函数1的摘录,作为示例,我想在其中设置断点:
(ocd) list Value.Eval_slevel 79 83
79
80    let slevel stmt = match slevel with
81      | Per_stmt_slevel.Global i -> i
82      | Per_stmt_slevel.PerStmt f -> f stmt
83

我尝试了几个不同的 break 命令,但每次都得到了相同的结果:

(ocd) break @ Value.Eval_slevel 80       // module + line number
Can't find any event there.
(ocd) break @ Value.Eval_slevel 80 21    // module + line + column
Can't find any event there.
(ocd) break @ Value.Eval_slevel # 3335   // module + character number
Can't find any event there.

我也尝试了附近的源代码(检查可能的行不匹配),并且尝试使用模块同义词(例如Eval_sleveleval_slevel),但都没有成功。
请注意,如果我手动步进程序直到它到达这个函数,它会显示在第80行确实有一个事件:
Time: 17447400 - pc: 3865360 - module Value.Eval_slevel
80    let slevel stmt = <|b|>match slevel with

在这种情况下,我可以手动设置本地断点:

(ocd) break
Breakpoint 1 at 3865360: file src/value/eval_slevel.ml, line 80,
  characters 22-119

但很显然,目标是能够不必手动查找就能完成操作。

如果我尝试使用函数名设置断点,ocamldebug 无法看到它。即使在程序运行到该事件之后,该标识符似乎也无法被 ocamldebug 看到:

(ocd) break Value.Eval_slevel.slevel
Unbound identifier Value.Eval_slevel.slevel

那是我无法设置断点的原因吗?如果是,是否有解决方法?否则,是否有其他设置这些断点的方法?
注: 以下是我尝试过的其他方法及一些观察结果:
- 在类似文件和函数上设置断点:同样会出现“找不到事件”的错误,但也有一些文件可以设置成功。 - 错误不是由于模块名称不正确造成的,否则ocamldebug会响应“没有该模块的源文件”。 - 错误不是由于不存在的行号造成的,否则会显示“位置超出范围”。 - 错误也不是由于模块初始化问题导致的,因为在这种情况下,消息会显示:“模块路径<module>尚未初始化。请向前运行程序,直至其初始化代码被执行。”
注1:此示例来自Frama-C,如果有人感兴趣,可以重现。然而,在该代码库之外,我无法制作出最小示例。
1个回答

0

你是否通过dynlink加载Value模块?我知道this issue已经存在一段时间,并且肯定适用于OCAML 4.02.1。如果是这种情况,您需要禁用dynlink并静态链接,以便使ocamldebug与该模块配合使用。


好观点,但更像是阐述而不是答案。评论部分可能更合适。 - vahdet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接