【问题标题】:What would be a more accurate decompiler than jad for Eclipse to get rid of <-MISALIGNED ->?什么是比 jad 更准确​​的反编译器来让 Eclipse 摆脱 <-MISALIGNED ->?
【发布时间】:2010-09-10 12:20:15
【问题描述】:

我使用 jad 已经很多年了,其中大部分都带有 Jadclipse 插件,这使得它非常有用。尤其是“对齐代码以进行调试”,它允许您查看堆栈跟踪中任何行的反编译代码。很不错。

不幸的是,我越来越多地看到 注释潜入其中,这很可能是因为 jad 期望类文件是有序的,而 Java 6 运行时库显然不是这种情况。因此,当写入文件时,一条指令说“这是第 100 行”,然后写入 99 个空行,如果下一条指令说“这是用于第 10 行”,那么 jad 不能倒带将该输出放在那里,而只是打印发表评论说这是在错误的地方。

这里是一个 HttpURLConnection 的例子:

          protected HttpURLConnection(URL url, Proxy proxy, Handler handler1)
            {
/* <-MISALIGNED-> */ /* 603*/        super(url);
/* <-MISALIGNED-> */ /* 192*/        ps = null;
/* <-MISALIGNED-> */ /* 196*/        errorStream = null;
/* <-MISALIGNED-> */ /* 199*/        setUserCookies = true;
/* <-MISALIGNED-> */ /* 200*/        userCookies = null;
/* <-MISALIGNED-> */ /* 220*/        currentProxyCredentials = null;
/* <-MISALIGNED-> */ /* 221*/        currentServerCredentials = null;
/* <-MISALIGNED-> */ /* 222*/        needToCheck = true;
/* <-MISALIGNED-> */ /* 223*/        doingNTLM2ndStage = false;
/* <-MISALIGNED-> */ /* 224*/        doingNTLMp2ndStage = false;
/* <-MISALIGNED-> */ /* 226*/        tryTransparentNTLMServer = NTLMAuthentication.supportsTransparentAuth();
/* <-MISALIGNED-> */ /* 227*/        tryTransparentNTLMProxy = NTLMAuthentication.supportsTransparentAuth();
/

现在的问题是是否有另一个反编译器可以生成更准确的逐行输出。实际的反编译不需要非常好或任何东西,但我真的很喜欢它位于 Java Stack Trace 视图所期望的位置。如果它与 Jadclipse 配合得很好,那就更好了。

【问题讨论】:

  • 我不是反编译器或字节码专家,但我很确定很难有一个可以反编译以匹配行号的反编译器。我使用Java Decompiler(名称中有什么),它只是将行号放在实际行之前的cmets中。通常没有什么是一致的,但我只是用它来查找一些东西,而不是进行任何实际的调试——不是我的代码,也可能是封闭源代码,不是我的工作。

标签: java decompiler jad jadclipse


【解决方案1】:

调试格式的问题来自jadclipse,而不是来自jadjad 没有这种能力。

jadclipse 插件在类名DebugAlignWriter 中有一个小代码部分,它执行以下操作:

if((align = getAlignTarget(aLine)) != -1)
{
   if(align < curLine)
   {
      if(curLine != 0)
      {
          out.write(10);
      }
      out.write("/* <-MISALIGNED-> */ ");
      out.write(aLine);
      curLine++;
   }
   else if(align == curLine)
   {
      out.write(aLine);
   }
   else
   {
      for(; align > curLine; curLine++)
      {
          out.write(10);
      }
      out.write(aLine);
   }

}

基本上它会尝试对齐来自jad 的输出。

所以根本原因是jad 产生的输出不一定按阅读顺序排列。不幸的是,我无法解释为什么jad 会那样做。根据jad的帮助,无法控制订单。

我在jadclipse 中注意到,如果您设置 JadClipse->Formatting->Don't insert a newline before opening bracket - 它会减少 @的数量987654332@ 段由于其工作方式的性质。

另外,如果您选中了方法前的输出字段选项,它可能会增加/* &lt;-MISALIGNED-&gt; */ 段的数量,因此请避免使用它。

【讨论】:

    【解决方案2】:

    JD-Eclipse 是一个非常好的反编译器,它还可以处理 java 7 的特性。

    它还没有“对齐调试代码”功能,但我自己添加了一个。去年我一直在使用它。

    我还处理必须向后移动线路的情况;我仍然将其标记为 MISALIGNED 以表示特殊情况,但至少它位于正确的行上。

    如果有人想尝试一下,可以从here 下载。 README.txt 中的更多详细信息

    【讨论】:

      【解决方案3】:

      我使用 jad 的格式尽可能少,然后我使用 eclipse 的格式命令,因为我可以使它与我偏好的样式相匹配。

      【讨论】:

      • 这不会破坏堆栈跟踪中的行号与 Eclipse 格式化程序完成后的行号之间的关联吗?
      猜你喜欢
      • 2016-07-31
      • 1970-01-01
      • 2011-07-18
      • 2020-09-29
      • 2020-08-25
      • 1970-01-01
      • 2018-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多