我正在使用OCaml 4.02.1中的ocamldebug,我想在特定模块内设置断点,但是我得到的只是一个有限的错误信息:
我也尝试了附近的源代码(检查可能的行不匹配),并且尝试使用模块同义词(例如
请注意,如果我手动步进程序直到它到达这个函数,它会显示在第80行确实有一个事件:
那是我无法设置断点的原因吗?如果是,是否有解决方法?否则,是否有其他设置这些断点的方法?
注: 以下是我尝试过的其他方法及一些观察结果:
- 在类似文件和函数上设置断点:同样会出现“找不到事件”的错误,但也有一些文件可以设置成功。 - 错误不是由于模块名称不正确造成的,否则ocamldebug会响应“没有该模块的源文件”。 - 错误不是由于不存在的行号造成的,否则会显示“位置超出范围”。 - 错误也不是由于模块初始化问题导致的,因为在这种情况下,消息会显示:“模块路径<module>尚未初始化。请向前运行程序,直至其初始化代码被执行。”
注1:此示例来自Frama-C,如果有人感兴趣,可以重现。然而,在该代码库之外,我无法制作出最小示例。
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_slevel
,eval_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,如果有人感兴趣,可以重现。然而,在该代码库之外,我无法制作出最小示例。