MULTI 调试器被一个断点关闭

MULTI debugger off by one breakpoint

有没有人见过 Multi debugger 得到错误的行号或一个断点?

我有一个 MULTI 脚本 (scripty.rc),它经历的过程取决于在该程序末尾遇到断点。该程序在两个循环之一中完成:

:failure
6648 NOP 
6649 b failure ; You are a failure

:complete
6650 NOP 
6651 b complete ; Your program worked, rejoice

所以我应该在 6649 或 6651 处中断,为用户打印该行,并让他们验证一切正常。

但是。

它在 6651 处没有断线。至少不总是这样。午饭前,当我确保一切正常时,我看到它如我所愿地击中了它。午饭后,当我和硬件人员一起演示它时,它打印出的行是 6650 NOP。到底是怎么回事?真的吗?我演示你的那一刻你就背叛了我?

我确认软件是一样的,这不是偷偷摸摸的提交。

我确认脚本是一样的。这不像是设置了不同的断点。

我用断点做数学运算。在脚本中它是 bp _start#2135 是的,_start 是 4516。是的,经过深入分析后,4516+2135=6651。

而且我看到它早些时候击中了正确的线。

我很想把这件事归咎于我与 MULTI 的不健康关系。变通方法很简单,但不确定的调试器听起来很可怕,我想 运行 将其接地。有没有人见过 Multi debugger 弄错行号或一个断点断点?任何人都知道它可能是什么?我是不是把事情搞砸了?

我找到了这个。这确实是愚蠢和简单的。

这就是 MULTI 的工作原理。当你设置一个断点时,它以procedure#123的形式记录下来。 123 是程序开始时的偏移量。我拥有的这个可爱的工具是用 ASM 编写的,所以只有一个 _start

MULTI 计算从 1 开始的过程行数。查看 MULTI 调试器的左侧。这也在帮助文件中 "MULTI: Debugging The Source Pane"。最左边的数字列是文件行号。右边的是"procedure-relative line number"。

所以在 proc#1 处中断并不是在过程行号 +1 处中断,而是在过程的第一行处中断。这不是真正的抵消。我不想在 4516+2135 处中断,而是想在 4516+ 第 2136 条指令处中断。我不知道 b _start#0 会做什么。

这里还有一个重要的教训,就是在填写错误报告和提问时不要偷懒。在上面,我输入了行号,但省略了程序号,认为它们不重要。