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

时间:2015-05-22 14:46:40

标签: debugging ocaml breakpoints

我正在使用ocamldebug(使用OCaml 4.02.1),我正在尝试在特定模块内的某处设置断点,但我得到的只是一个稍微有用的错误消息:Can't find any event there.

作为一个例子,这里是函数 1 的摘录,其中我想设置一个断点,如ocamldebug所列:

(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

这就是我无法设置断点的原因吗?如果是这样,有解决方法吗?否则,是否有其他方法来设置这些断点?

备注

以下是我尝试过的其他一些事情,以及一些观察结果:

  • 在类似的文件和函数上设置断点:我也获得Can't find any event there.,但有些文件可以使用它。
  • 错误不是由于模块名称不正确,否则ocamldebug会以No source file for <module>回复。
  • 错误不是由于不存在的行号,否则会显示Position out of range.
  • 错误不是模块初始化问题,因为在这种情况下的消息是:The module path <module> is not yet initialized. Please run program forward until its initialization code is executed.

1 这个例子来自Frama-C,它是可重复的,万一有人会感兴趣。但是,我无法在该代码库之外生成一个最小的示例。

1 个答案:

答案 0 :(得分:0)

您是否通过dynlink加载Value模块?我知道this issue已经开放了一段时间,肯定会适用于OCAML 4.02.1。如果是这种情况,则必须静态禁用dynlink和链接才能使ocamldebug与该模块一起使用。