代码之家  ›  专栏  ›  技术社区  ›  notnoop

调试处理略有不同的输入

  •  0
  • notnoop  · 技术社区  · 15 年前

    我目前正在研究Java编译器。在编译器的上下文中,稍有不同的输入可能导致不同的输出(例如,添加 final 在Java中允许编译器执行更多的优化。在其他一些情况下,不同的输入可能导致相同的输出(例如,为每个循环取消某些构造的建议)。

    在调试编译器如何处理这些情况时,我通常会运行编译器,并尝试找出编译器的运行时执行路径在哪里发散(或聚合)。不用说,这很乏味。

    我想知道您是否有任何提示可以帮助我调试这些情况。

    此外,是否有任何工具可以跟踪两个程序执行并为您提供执行路径的差异。

    1 回复  |  直到 15 年前
        1
  •  2
  •   Sam Harwell    15 年前

    我正在研究一个cli字节代码--gt;本机代码jit,这是不同的,但我们面临着类似的障碍。我放了一个特别的 ToString 中的方法将很好地打印字节代码的当前状态以及强类型的评估堆栈等。它允许我使用文本差异工具在每个步骤中直观地检查代码转换。最后,我想制作一个调试器可视化工具 弦线 “每个步骤的代码,让我直接在调试器中向后/向前移动,并突出显示更改。

    如果您漂亮地打印语法树,可以用类似的方式对其进行区分。

    编辑:我写了一个基本的 Annotator 类,该类将IL字节代码与生成的本机代码的汇编语言表示形式交错。它有一个 ToHtmlString() 方法,它允许我利用Visual Studio调试器中内置的HTML可视化工具。请不要批评ARM代码——我只是黑客入侵了一些东西,这样我就可以专注于注释器,现在它起作用了,我将使用它来处理正确的代码生成器。

    右键单击“查看图像”(View image),如果您想查看合适的大小。:)

    alt text http://www.280z28.org/images/vmx/2009-08-23-Annotator.png