Debugging 跨版本行匹配

Debugging 跨版本行匹配,debugging,version-control,Debugging,Version Control,我正在考虑如何进行自动错误跟踪,作为其中的一部分,我想知道如何将一个版本的程序中的源代码行号(或通过类似的方式从指令指针映射的更精确的数字)与另一个版本中的同一行相匹配。(假设所有内容都在某种源代码控制中,并且我的代码可以使用) 最简单的方法是对文件使用diff工具/lib,并对行号跨度进行一些计算,但这有一些限制: 它不处理跨文件运动 它可能无法很好地处理那些被改变的台词 它不查看中间版本中可用的信息 当diff工具出错时,它不提供手动修补线路的方法 有点笨重 在我开始着手开发更好的产品之

我正在考虑如何进行自动错误跟踪,作为其中的一部分,我想知道如何将一个版本的程序中的源代码行号(或通过类似的方式从指令指针映射的更精确的数字)与另一个版本中的同一行相匹配。(假设所有内容都在某种源代码控制中,并且我的代码可以使用)

最简单的方法是对文件使用diff工具/lib,并对行号跨度进行一些计算,但这有一些限制:

  • 它不处理跨文件运动
  • 它可能无法很好地处理那些被改变的台词
  • 它不查看中间版本中可用的信息
  • 当diff工具出错时,它不提供手动修补线路的方法
  • 有点笨重
在我开始着手开发更好的产品之前:

  • 已经存在什么可以做到这一点
  • 类似的系统有哪些我没有想到的功能

    • 您为什么需要这样做?如果您使用的是像样的源代码版本控制,那么您应该可以访问旧版本的代码,您只需提供一个指向该代码的链接,这样人们就可以在其原始位置看到错误。事实上,我看到这个系统的主要问题是,这个bug可能已经被修复了,但是你的自动行跟踪代码会指向一行并说那里有bug。这个系统似乎很难构建,而且在实践中也没有提供太多帮助。

      我的建议是:不要试图跟踪行号,正如您所观察到的,行号会随着软件更改而快速失去同步,而应该用一个唯一标识符来修饰每个断言(或其他感兴趣的行)

      假设您使用的是C语言,在断言的情况下,这可以像更改
      assert(x==42)一样简单
      断言((“检查x”,x==42))--这在功能上是相同的,这是由于C中逗号运算符的语义以及字符串文本的计算结果始终为true这一事实

      当然,这意味着您需要事先确定您希望跟踪的项目。但是,考虑到目前还没有一种可靠的方法来匹配不同版本的源代码行号(我的意思是,对于您可能提出的任何机制,我相信我可以提出一种情况,在这种情况下,该机制做了错误的事情),我认为这是您所能做的最好的方法


      另一个想法:如果你使用C++,你可以很好地跟踪动态范围。基本上,您有一个

      Track
      类,其构造函数接受一个描述作用域的字符串,并将其添加到当前活动作用域的全局堆栈中。
      轨迹
      析构函数将顶部元素从堆栈中弹出。最后一个组成部分是一个静态函数
      Track::getState()
      ,它只返回当前所有活动作用域的列表——这可以从异常处理程序或其他错误处理机制调用。

      我想的不是按行号跟踪特定的bug(棘手的bug有多少次有一个行号)但是,更重要的是要跟踪关于在哪里发现东西的统计数据。例如;什么断言最常被击中?当断言跳闸时,堆栈上最常见的代码行是什么?诸如此类的事情。能够将这种东西从一个版本组合到另一个版本将是非常好的。