【问题标题】:How do I read this line in a Java stack trace?如何在 Java 堆栈跟踪中读取这一行?
【发布时间】:2018-02-22 14:04:51
【问题描述】:

由于 lambda 的参与,堆栈变得复杂(请注意,由于混淆,行号丢失了)。 “access$lambda$12”实际上是什么意思,有没有办法在不知道实际行号的情况下在代码中找到它?

at com.group.RKGroup.com.my.MyClass access$lambda$12(com.group.RKGroup,int,com.my.PType) (RKGroup.java:43324)

行号没有用,因为这个堆栈跟踪被 Proguard 混淆了。

【问题讨论】:

  • 这表示在您的 access 方法中声明的 lambda。可能是该方法中的第 12 个....虽然我不会发誓。
  • 第十二个匿名类
  • @Eran:行号没有用,因为这个堆栈跟踪被 Proguard 混淆了。
  • 对于那个 lambda 的调用者(下一行),总是会有帮助。来源并没有真正的行号 43324,我祈祷?

标签: java


【解决方案1】:

在正常情况下,这表示在名为 access 的方法中声明的 lambda。可能是该方法中的第 12 个 lambda ......虽然我不会发誓。

请注意,由于混淆,行号丢失了。

好的,这解释了您如何将void [原文如此] 作为类名。但这也意味着方法名称也可能是伪造的。

您要确定此行所指的内容的唯一方法是尝试对字节码进行逆向工程。

此时,我建议您将堆栈跟踪发送给该软件的供应商,并让他们帮助您。如果他们不能或不会,请请求访问源代码。如果他们不能或不会给您访问权限,请寻找新产品。调试别人的混淆代码是一场噩梦。

【讨论】:

    【解决方案2】:

    这看起来像 lambda 在方法中,但是...

    javac 不会生成这样的名称(接近,但不是)。 javac(即使从未指定)将它们生成为

    lambda$<method-name-where-used>$<incremental-number>
    

    或者如果你有这样的事情:

    List<Integer> r = Stream.of(1).map(x -> x).collect(Collectors.toList());
    lambda$new$<incremental-number> 
    

    请注意,在您的情况下,方法名称 (access) 排在第一位,因此这看起来非常像 retro-lambdaandroid。 IIRC 他们生成这样的代码,这又是未指定的,但这真正意味着您的 access 方法中有一个 lambda 表达式,特别是该方法中的第 12 个 lambda。同样,IIRC,retro-lambda 使用相同的增量每个方法命名。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多